/ Hex Artifact Content
Login

Artifact d5f5b30e99c76313be8c536ddfe23ef8f977dce1:


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 35 20 32 30 30 39 2f 30  c,v 1.695 2009/0
0190: 37 2f 32 31 20 31 35 3a 33 33 3a 31 34 20 64 72  7/21 15:33:14 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 20  Overflow==0 );. 
9340: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3c 70   assert( nByte<p
9350: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
9360: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9370: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9380: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9390: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
93a0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
93b0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
93c0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
93d0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
93e0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
93f0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9400: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20  [hdr+5]);.  if( 
9410: 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75 72 6e  gap>top ) return
9420: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9430: 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61 73 65  BKPT;.  testcase
9440: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
9450: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
9460: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
9470: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
9480: 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  ;..  if( nFrag>=
9490: 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77  60 ){.    /* Alw
94a0: 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20 68  ays defragment h
94b0: 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65 64  ighly fragmented
94c0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 63   pages */.    rc
94d0: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
94e0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
94f0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
9500: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
9510: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9520: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9530: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9540: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9550: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9560: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9570: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9580: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9590: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
95a0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
95b0: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
95c0: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
95d0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
95e0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
95f0: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
9600: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
9610: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
9620: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
9630: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
9640: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
9650: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
9660: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
9670: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
9680: 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a  +2]);     /* Siz
9690: 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a  e of free slot *
96a0: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  /.      if( size
96b0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
96c0: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
96d0: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
96e0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
96f0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9700: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
9710: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
9720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
9730: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
9740: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
9750: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
9760: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  er of.          
9770: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
9780: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
9790: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
97a0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
97b0: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
97c0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
97d0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38  ata[hdr+7] = (u8
97e0: 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20  )(nFrag + x);.  
97f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9800: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
9810: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
9820: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
9830: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
9840: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
9850: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
9860: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
9870: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
9880: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75   */.          pu
9890: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
98a0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  2], x);.        
98b0: 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20  }.        *pIdx 
98c0: 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  = pc + x;.      
98d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
98e0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
98f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
9900: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
9910: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
9920: 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20  pace in the gap 
9930: 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20  to satisfy.  ** 
9940: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  the allocation. 
9950: 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d   If not, defragm
9960: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ent..  */.  test
9970: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
9980: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
9990: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
99a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  ){.    rc = defr
99b0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
99c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
99d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
99e0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
99f0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
9a00: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
9a10: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
9a20: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
9a30: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
9a40: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
9a50: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9a60: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
9a70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9a80: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
9a90: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
9aa0: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
9ab0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
9ac0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
9ad0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
9ae0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
9af0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
9b00: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
9b10: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
9b20: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
9b30: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
9b40: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
9b50: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
9b60: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
9b70: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
9b80: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
9b90: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
9ba0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
9bb0: 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65  p+nByte <= pPage
9bc0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9bd0: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
9be0: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
9bf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9c00: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
9c10: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
9c20: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
9c30: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
9c40: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
9c50: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
9c60: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
9c70: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
9c80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
9c90: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
9ca0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
9cb0: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
9cc0: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
9cd0: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
9ce0: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
9cf0: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
9d00: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
9d10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
9d20: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
9d30: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61   *pPage, int sta
9d40: 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  rt, int size){. 
9d50: 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69   int addr, pbegi
9d60: 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c  n, hdr;.  int iL
9d70: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9d90: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
9da0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
9db0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9dc0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
9dd0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
9de0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
9df0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9e00: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9e10: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9e20: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9e30: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
9e40: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
9e50: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9e60: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
9e70: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
9e80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9e90: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
9ea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9eb0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9ec0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9ed0: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
9ee0: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
9ef0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
9f00: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9f10: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
9f20: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
9f30: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
9f40: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
9f50: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
9f60: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
9f70: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
9f80: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
9f90: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
9fa0: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
9fb0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
9fc0: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
9fd0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
9fe0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
9ff0: 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  s.  Note that.  
a000: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  ** even though t
a010: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
a020: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
a030: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a040: 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74  ,.  ** btreeInit
a050: 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20 64  Page() did not d
a060: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69 6e  etect overlappin
a070: 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20  g cells or.  ** 
a080: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
a090: 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c 73  overlapped cells
a0a0: 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  .   Nor does it 
a0b0: 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65 0a  detect when the.
a0c0: 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e    ** cell conten
a0d0: 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20 74  t area exceeds t
a0e0: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
a0f0: 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49 66  page header.  If
a100: 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74 75   these.  ** situ
a110: 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74 68  ations arise, th
a120: 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  en subsequent in
a130: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
a140: 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20 20  might corrupt.  
a150: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a160: 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64 20    So we do need 
a170: 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 72  to check for cor
a180: 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73 63  ruption while sc
a190: 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anning.  ** the 
a1a0: 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
a1b0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
a1c0: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
a1d0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61  = hdr + 1;.  iLa
a1e0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
a1f0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
a200: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
a210: 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68 69  <=iLast );.  whi
a220: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
a230: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a240: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
a250: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  egin>0 ){.    if
a260: 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34 20  ( pbegin<addr+4 
a270: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a280: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a290: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
a2a0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
a2b0: 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e 69  }.  if( pbegin>i
a2c0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Last ){.    retu
a2d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a2e0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
a2f0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
a300: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
a310: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a320: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
a330: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a340: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
a350: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
a360: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
a370: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
a380: 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46  Free = pPage->nF
a390: 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b  ree + (u16)size;
a3a0: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
a3b0: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
a3c0: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
a3d0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
a3e0: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
a3f0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a400: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ]))>0 ){.    int
a410: 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78   pnext, psize, x
a420: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a430: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
a440: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
a450: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a460: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
a470: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
a480: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
a490: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
a4a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a4b0: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
a4c0: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
a4d0: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
a4e0: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
a4f0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
a500: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
a510: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66  e);.      if( (f
a520: 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e  rag<0) || (frag>
a530: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
a540: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
a550: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a560: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
a570: 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b  .      data[hdr+
a580: 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a  7] -= (u8)frag;.
a590: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
a5a0: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
a5b0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a5c0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
a5d0: 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e  x);.      x = pn
a5e0: 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26  ext + get2byte(&
a5f0: 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d  data[pnext+2]) -
a600: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70   pbegin;.      p
a610: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
a620: 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  egin+2], x);.   
a630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
a640: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
a650: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
a660: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
a670: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
a680: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
a690: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
a6a0: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
a6b0: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
a6c0: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
a6d0: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
a6e0: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
a6f0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a700: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
a710: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
a720: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
a730: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
a740: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a750: 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32  a[hdr+5]) + get2
a760: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a770: 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  n+2]);.    put2b
a780: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a790: 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73  , top);.  }.  as
a7a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
a7b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
a7c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
a7d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a7e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
a7f0: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
a800: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
a810: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
a820: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
a830: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
a840: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
a850: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
a860: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
a870: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
a880: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
a890: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
a8a0: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
a8b0: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
a8c0: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
a8d0: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
a8e0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
a8f0: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
a900: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
a910: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
a920: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
a930: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
a940: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
a950: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a960: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
a970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
a980: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
a990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
a9a0: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
a9b0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
a9c0: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
a9d0: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
a9e0: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
a9f0: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
aa00: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
aa10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
aa20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
aa30: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
aa40: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
aa50: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
aa60: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
aa70: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
aa80: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
aa90: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
aaa0: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
aab0: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
aac0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
aad0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
aae0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
aaf0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
ab00: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
ab10: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ab20: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
ab30: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
ab40: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
ab50: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
ab60: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
ab70: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
ab80: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
ab90: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
aba0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
abb0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
abc0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
abd0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
abe0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
abf0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
ac00: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
ac10: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ac20: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ac30: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ac40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ac50: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
ac60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ac70: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
ac80: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
ac90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
aca0: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
acb0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
acc0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
acd0: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
ace0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
acf0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
ad00: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
ad10: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
ad20: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
ad30: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
ad40: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
ad50: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
ad60: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
ad70: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ad80: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
ad90: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
ada0: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
adb0: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
adc0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
add0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
ade0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
adf0: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
ae00: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
ae10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ae20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ae30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
ae40: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
ae50: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
ae60: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
ae70: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
ae80: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ae90: 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
aea0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
aeb0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
aec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aed0: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
aee0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
aef0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
af00: 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
af10: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
af20: 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20  u16 pc;         
af30: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
af40: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
af50: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
af60: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72  [] */.    u8 hdr
af70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
af80: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
af90: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
afa0: 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61  er */.    u8 *da
afb0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
afc0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
afd0: 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53  aData */.    BtS
afe0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
aff0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
b000: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
b010: 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c 65  /.    u16 usable
b020: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
b030: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
b040: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
b050: 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  */.    u16 cellO
b060: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
b070: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
b080: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
b090: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
b0a0: 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20      u16 nFree;  
b0b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b0c0: 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
b0d0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b0e0: 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20      u16 top;    
b0f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b100: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
b110: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
b120: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  .    int iCellFi
b130: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
b140: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b150: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
b160: 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  set */.    int i
b170: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
b180: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
b190: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
b1a0: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20   offset */..    
b1b0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
b1c0: 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  ;..    hdr = pPa
b1d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1e0: 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
b1f0: 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  >aData;.    if( 
b200: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
b210: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
b220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b230: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
b240: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
b250: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
b260: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
b270: 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  68 );.    pPage-
b280: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d  >maskPage = pBt-
b290: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20  >pageSize - 1;. 
b2a0: 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
b2b0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61  low = 0;.    usa
b2c0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
b2d0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70  sableSize;.    p
b2e0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
b2f0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
b300: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
b310: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f  ge->leaf;.    to
b320: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
b330: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
b340: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
b350: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b360: 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  r+3]);.    if( p
b370: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
b380: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
b390: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
b3a0: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
b3b0: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
b3c0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
b3d0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
b3e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b3f0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  KPT;.    }.    t
b400: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
b410: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
b420: 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  Bt) );..    /* A
b430: 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
b440: 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
b450: 61 75 73 65 20 75 73 65 20 74 6f 20 72 65 61 64  ause use to read
b460: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
b470: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
b480: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
b490: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
b4a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
b4b0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
b4c0: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
b4d0: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
b4e0: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
b4f0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
b500: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
b510: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
b520: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
b530: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
b540: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
b550: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
b560: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
b570: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
b580: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
b590: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66  bleSize - 4;.#if
b5a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b5b0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
b5c0: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
b5d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
b5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
b5f0: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
b600: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
b610: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
b620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b630: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
b640: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
b650: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
b660: 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28  st--;.      for(
b670: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
b680: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
b690: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
b6a0: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
b6b0: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
b6c0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
b6d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
b6e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b6f0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
b700: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
b710: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
b720: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
b730: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b750: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
b760: 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
b770: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
b780: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
b790: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
b7a0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b7b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
b7c0: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
b7d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b7e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b7f0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
b800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b810: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b820: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
b830: 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20    }  .#endif..  
b840: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
b850: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
b860: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
b870: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
b880: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
b890: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
b8a0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
b8b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30  .    while( pc>0
b8c0: 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65   ){.      u16 ne
b8d0: 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  xt, size;.      
b8e0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b8f0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b900: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
b910: 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66  Free block is of
b920: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
b930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b940: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b950: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
b960: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
b970: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
b980: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
b990: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
b9a0: 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e  .      if( next>
b9b0: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
b9c0: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20  ze+3 ){.        
b9d0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
b9e0: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
b9f0: 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
ba00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ba10: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ba20: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
ba30: 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20  nFree = nFree + 
ba40: 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d  size;.      pc =
ba50: 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20   next;.    }..  
ba60: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
ba70: 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
ba80: 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
ba90: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
baa0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20  start.    ** of 
bab0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bac0: 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e   area plus the n
bad0: 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79  umber of free by
bae0: 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a  tes within.    *
baf0: 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
bb00: 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
bb10: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
bb20: 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
bb30: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
bb40: 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
bb50: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
bb60: 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
bb70: 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72   also.    ** ser
bb80: 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  ves to verify th
bb90: 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  at the offset to
bba0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
bbb0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20  e cell-content. 
bbc0: 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f     ** area, acco
bbd0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  rding to the pag
bbe0: 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77  e header, lies w
bbf0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a  ithin the page..
bc00: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
bc10: 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
bc20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bc30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bc40: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
bc50: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e  pPage->nFree = n
bc60: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
bc70: 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  t;.    pPage->is
bc80: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Init = 1;.  }.  
bc90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
bcb0: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
bcc0: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
bcd0: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
bce0: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
bcf0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
bd00: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
bd10: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
bd20: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bd30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bd40: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bd50: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
bd60: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
bd70: 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
bd80: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
bd90: 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
bda0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bdb0: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
bdc0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
bdd0: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
bde0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
bdf0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
be00: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
be10: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
be20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
be30: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
be40: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
be50: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
be60: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
be70: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
be80: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
be90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
bea0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
beb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
bec0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
bed0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
bee0: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
bef0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
bf00: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
bf10: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
bf20: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
bf30: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
bf40: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
bf50: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
bf60: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
bf70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bf80: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
bf90: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
bfa0: 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61  nFree = pBt->usa
bfb0: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b  bleSize - first;
bfc0: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
bfd0: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
bfe0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
bff0: 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d   = hdr;.  pPage-
c000: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
c010: 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  rst;.  pPage->nO
c020: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
c030: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
c040: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
c050: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
c060: 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  8 );.  pPage->ma
c070: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
c080: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50  geSize - 1;.  pP
c090: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c0a0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c0b0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c0c0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c0d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c0e0: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c0f0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c100: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c110: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c120: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c130: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c140: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c150: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c160: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c170: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c180: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c190: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c1a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c1b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c1c0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c1d0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c1e0: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c1f0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c200: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c210: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c220: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c230: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c240: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c250: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c260: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c270: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c280: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c290: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c2a0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c2b0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c2c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c2d0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c2e0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c2f0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c300: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c310: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c320: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c330: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c340: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c350: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c360: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c370: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c380: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c390: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c3a0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c3b0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c3c0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c3d0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c3e0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c3f0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c400: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c410: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c420: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c430: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c440: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c450: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c460: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
c470: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
c480: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
c490: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c4a0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
c4b0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
c4c0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
c4d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
c4e0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
c4f0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
c500: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
c510: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
c520: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
c530: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c540: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
c550: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
c560: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c570: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c580: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c590: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
c5a0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
c5b0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
c5c0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
c5d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
c5e0: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
c5f0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
c600: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
c610: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
c620: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c630: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
c640: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
c650: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
c660: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
c670: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
c680: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
c690: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
c6a0: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
c6b0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
c6c0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
c6d0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
c6e0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
c6f0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
c700: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
c710: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
c720: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
c730: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
c740: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c750: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c760: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
c770: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
c780: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
c790: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
c7a0: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
c7b0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
c7c0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
c7d0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
c7e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
c7f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c800: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
c810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
c820: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
c830: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
c840: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
c850: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
c860: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
c870: 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no pagerPagecoun
c880: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
c890: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20  {.  int nPage = 
c8a0: 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  -1;.  int rc;.  
c8b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
c8c0: 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ge1 );.  rc = sq
c8d0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
c8e0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
c8f0: 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65   &nPage);.  asse
c900: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
c910: 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29  K || nPage==-1 )
c920: 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f  ;.  return (Pgno
c930: 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nPage;.}../*.**
c940: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
c950: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
c960: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
c970: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
c980: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
c990: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
c9a0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
c9b0: 6c 73 20 74 6f 0a 2a 2a 20 62 74 72 65 65 47 65  ls to.** btreeGe
c9c0: 74 50 61 67 65 28 29 20 61 6e 64 20 62 74 72 65  tPage() and btre
c9d0: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a  eInitPage()..*/.
c9e0: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
c9f0: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
ca00: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
ca10: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
ca20: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
ca30: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
ca40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ca50: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
ca60: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
ca70: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
ca80: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
ca90: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
caa0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
cab0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
cac0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cad0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
cae0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
caf0: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
cb00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
cb10: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
cb20: 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e    /* It is often
cb30: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
cb40: 68 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20  he page we want 
cb50: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  is already in ca
cb60: 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c  che..  ** If so,
cb70: 20 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79   get it directly
cb80: 2e 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73  .  This saves us
cb90: 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20   from having to 
cba0: 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50  call.  ** pagerP
cbb0: 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61  agecount() to ma
cbc0: 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20  ke sure pgno is 
cbd0: 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77  within limits, w
cbe0: 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a  hich results.  *
cbf0: 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62  * in a measureab
cc00: 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  le performance i
cc10: 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a  mprovements..  *
cc20: 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  /.  *ppPage = pP
cc30: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
cc40: 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e 6f 29  ookup(pBt, pgno)
cc50: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  ;.  if( pPage ){
cc60: 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20  .    /* Page is 
cc70: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
cc80: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
cc90: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
cca0: 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74  .    /* Page not
ccb0: 20 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75   in cache.  Acqu
ccc0: 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 74  ire it. */.    t
ccd0: 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 70  estcase( pgno==p
cce0: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
ccf0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 67  t) );.    if( pg
cd00: 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
cd10: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
cd20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
cd30: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
cd40: 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65   }.    rc = btre
cd50: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
cd60: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
cd70: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
cd80: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
cd90: 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d  e = *ppPage;.  }
cda0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
cdb0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20  sInit ){.    rc 
cdc0: 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
cdd0: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pPage);.  }.  if
cde0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cdf0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
ce00: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a  ge(pPage);.    *
ce10: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
ce20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ce30: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
ce40: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
ce50: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
ce60: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
ce70: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
ce80: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
ce90: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
cea0: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
ceb0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
cec0: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
ced0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
cee0: 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  flow==0 || sqlit
cef0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
cf00: 75 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61  unt(pPage->pDbPa
cf10: 67 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73  ge)>1 );.    ass
cf20: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
cf30: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
cf40: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
cf50: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
cf60: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
cf70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
cf80: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
cf90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
cfa0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
cfb0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
cfc0: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
cfd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
cfe0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cff0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d000: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d010: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d020: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d030: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d040: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d050: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d060: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d070: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d080: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d090: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d0a0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d0b0: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d0c0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d0d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d0e0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d0f0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d100: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d120: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d130: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d140: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d150: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d160: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d170: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d180: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d190: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d1a0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d1b0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d1c0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d1d0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d1e0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d1f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d200: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d210: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d220: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d230: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d240: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d250: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d260: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d270: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d280: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d290: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d2a0: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d2b0: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d2c0: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d2d0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d2e0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d2f0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d300: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d310: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d320: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d330: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d340: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d350: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d360: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d370: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d380: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d390: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d3a0: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d3b0: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d3c0: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d3d0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d3e0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d3f0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d400: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d410: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d420: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d430: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d440: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d450: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d460: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d470: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d480: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d490: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d4a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d4b0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d4c0: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d4d0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d4e0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d4f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d500: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d520: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d530: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d540: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d550: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d560: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d580: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d590: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d5a0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d5b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d5c0: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d5d0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65   is NULL.** a ne
d5e0: 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  w database with 
d5f0: 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73  a random name is
d600: 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20   created.  This 
d610: 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a  randomly named.*
d620: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
d630: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
d640: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
d650: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
d660: 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  ed..** If zFilen
d670: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
d680: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
d690: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
d6a0: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
d6b0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
d6c0: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
d6d0: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
d6e0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
d6f0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
d700: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
d710: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d720: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
d730: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
d740: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
d750: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
d760: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
d770: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
d780: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
d790: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
d7a0: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
d7b0: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
d7c0: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
d7d0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
d7e0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
d7f0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
d800: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
d810: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
d820: 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  Open(.  const ch
d830: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
d840: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
d850: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
d860: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
d870: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
d880: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
d890: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
d8a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
d8b0: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
d8c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
d8d0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
d8e0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
d8f0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
d900: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
d910: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
d920: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
d930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
d940: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
d950: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
d960: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
d970: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
d980: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
d990: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75   /* The VFS to u
d9a0: 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65  se for this btre
d9b0: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
d9c0: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
d9d0: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
d9e0: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
d9f0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
da00: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
da10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
da20: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
da30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
da40: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
da50: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
da60: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
da70: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
da80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
da90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
daa0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
dab0: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
dac0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
dad0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
dae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
daf0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
db00: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
db10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
db20: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
db30: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
db40: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
db50: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
db60: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
db70: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
db80: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
db90: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
dba0: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
dbb0: 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  d database. This
dbc0: 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20   symbol is only 
dbd0: 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a  required if.  **
dbe0: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
dbf0: 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75  hared-data or au
dc00: 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65  tovacuum feature
dc10: 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a  s are compiled .
dc20: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69    ** into the li
dc30: 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  brary..  */.#if 
dc40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dc50: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
dc60: 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  E) || !defined(S
dc70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
dc80: 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20  ACUUM).  #ifdef 
dc90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
dca0: 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69  RYDB.    const i
dcb0: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
dcc0: 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73    #else.    cons
dcd0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
dce0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74  zFilename && !st
dcf0: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
dd00: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23  ":memory:");.  #
dd10: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
dd20: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
dd30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dd40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
dd50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
dd60: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
dd70: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
dd80: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
dd90: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
dda0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ddb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ddc0: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
ddd0: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
dde0: 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
ddf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
de00: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
de10: 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
de20: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
de30: 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
de40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
de50: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
de60: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
de70: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
de80: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
de90: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
dea0: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
deb0: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
dec0: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
ded0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
dee0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
def0: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
df00: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
df10: 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c  Memdb==0 && zFil
df20: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
df30: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28  me[0] ){.    if(
df40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
df50: 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
df60: 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20  Enabled ){.     
df70: 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
df80: 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
df90: 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
dfa0: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
dfb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
dfc0: 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  oc(nFullPathname
dfd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dfe0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
dff0: 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  red;.      p->sh
e000: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
e010: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
e020: 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63 68  QLITE_SharedCach
e030: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  e;.      if( !zF
e040: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e050: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e060: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
e070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e080: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
e090: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c     sqlite3OsFull
e0a0: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
e0b0: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
e0c0: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
e0d0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
e0e0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
e0f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
e100: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
e110: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
e120: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e130: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
e140: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
e150: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
e160: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
e170: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
e180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
e190: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
e1a0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
e1b0: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
e1c0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
e1d0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
e1e0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
e1f0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
e200: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
e210: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
e220: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
e230: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
e240: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
e250: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e270: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
e280: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
e290: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
e2a0: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
e2b0: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
e2c0: 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
e2d0: 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
e2e0: 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
e2f0: 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
e300: 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
e310: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
e320: 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
e330: 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
e340: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e350: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
e360: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
e370: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e380: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
e390: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
e3a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3b0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
e3c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
e3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e3e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
e3f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e400: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
e410: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e430: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
e440: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
e450: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
e460: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
e470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e490: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
e4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
e4b0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e4c0: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
e4d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
e4e0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
e4f0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
e500: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
e510: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
e520: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
e530: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
e540: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
e550: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
e560: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
e570: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
e580: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
e590: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
e5a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e5b0: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
e5c0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
e5d0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
e5e0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
e5f0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
e600: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
e610: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
e620: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
e630: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
e640: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
e650: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
e660: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
e670: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
e680: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
e690: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
e6a0: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
e6b0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
e6c0: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
e6d0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
e6e0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
e6f0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
e700: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
e710: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
e720: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
e730: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
e740: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
e750: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
e760: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
e770: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
e780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e790: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
e7a0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e7b0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
e7c0: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
e7d0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
e7e0: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
e7f0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
e800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e810: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
e820: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
e830: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
e840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
e850: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
e860: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
e870: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
e890: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
e8a0: 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  vfsFlags);.    i
e8b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e8c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e8d0: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
e8e0: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
e8f0: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
e900: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
e910: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
e920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e930: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
e940: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
e950: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20    }.    pBt->db 
e960: 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
e970: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
e980: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
e990: 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
e9a0: 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
e9b0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
e9c0: 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33  ;.  .    sqlite3
e9d0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
e9e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61  (pBt->pPager, pa
e9f0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70  geReinit);.    p
ea00: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
ea10: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
ea20: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72   = 0;.    pBt->r
ea30: 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65  eadOnly = sqlite
ea40: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
ea50: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
ea60: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
ea70: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
ea80: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
ea90: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
eaa0: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
eab0: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
eac0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
ead0: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
eae0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
eaf0: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
eb00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
eb10: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
eb20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
eb30: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
eb40: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
eb50: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
eb60: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
eb70: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
eb80: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
eb90: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
eba0: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
ebb0: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
ebc0: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
ebd0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
ebe0: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
ebf0: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
ec00: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
ec10: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
ec20: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
ec30: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
ec40: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
ec50: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
ec60: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
ec70: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
ec80: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
ec90: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
eca0: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
ecb0: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
ecc0: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
ecd0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
ece0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ecf0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
ed00: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
ed10: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
ed20: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
ed30: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
ed40: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
ed50: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
ed60: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
ed70: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
ed80: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
ed90: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
eda0: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
edb0: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
edc0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
edd0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ede0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
edf0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
ee00: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
ee10: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
ee20: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
ee30: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ee40: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
ee50: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
ee60: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
ee70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
ee80: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
ee90: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
eea0: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
eeb0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
eec0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
eed0: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
eee0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
eef0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
ef00: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
ef10: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
ef20: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
ef30: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
ef40: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
ef50: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
ef60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ef70: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
ef80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ef90: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
efa0: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
efb0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
efc0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
efd0: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
efe0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
eff0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
f000: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f010: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
f020: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
f030: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
f040: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
f050: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
f060: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
f070: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
f080: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
f090: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
f0a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
f0b0: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
f0c0: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
f0d0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f0e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f0f0: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
f100: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
f110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
f120: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f130: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
f140: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
f150: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f160: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f180: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f190: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
f1a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f1b0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
f1c0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f1d0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f1e0: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
f1f0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f200: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f210: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
f220: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f230: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
f240: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
f250: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
f260: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f270: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f280: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f290: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f2a0: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
f2b0: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
f2c0: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
f2d0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
f2e0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
f2f0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
f300: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
f310: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
f320: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
f330: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
f340: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f350: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
f360: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
f370: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f380: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
f390: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
f3a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f3b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f3c0: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
f3d0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
f3e0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
f3f0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
f400: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
f410: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
f420: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
f430: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
f440: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f450: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
f460: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f470: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
f480: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
f490: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
f4a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
f4b0: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
f4c0: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
f4d0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
f4e0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
f4f0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f500: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f510: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
f520: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f530: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
f540: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
f550: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
f560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
f570: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
f580: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f590: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
f5a0: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
f5b0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
f5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f5d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
f5e0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
f5f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
f600: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f610: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
f620: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
f630: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
f640: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
f650: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
f660: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
f670: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f680: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
f690: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
f6a0: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
f6b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
f6c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f6d0: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
f6e0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f6f0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
f700: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f710: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
f720: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
f730: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
f740: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
f750: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
f760: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
f770: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
f780: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
f790: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
f7a0: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
f7b0: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
f7c0: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
f7d0: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
f7e0: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
f7f0: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
f800: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
f810: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
f820: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
f830: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f840: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
f850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
f860: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
f870: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
f880: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
f890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f8a0: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
f8b0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
f8c0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
f8d0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f8e0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f8f0: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
f900: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
f910: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
f920: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
f930: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
f940: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
f950: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f960: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
f970: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
f980: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f990: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f9a0: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
f9b0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
f9c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
f9d0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f9e0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f9f0: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
fa00: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
fa10: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
fa20: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
fa30: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
fa40: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
fa50: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
fa60: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
fa70: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
fa80: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
fa90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
faa0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
fab0: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
fac0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
fad0: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
fae0: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
faf0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
fb00: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
fb10: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
fb20: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
fb30: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
fb40: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
fb50: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
fb60: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
fb70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
fb80: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
fb90: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
fba0: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
fbb0: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
fbc0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
fbd0: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
fbe0: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
fbf0: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
fc00: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
fc10: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
fc20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
fc30: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
fc40: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
fc50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
fc60: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
fc70: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
fc80: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
fc90: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
fca0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fcb0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
fcc0: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
fcd0: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
fce0: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
fcf0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fd00: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
fd10: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
fd20: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fd30: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
fd40: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
fd50: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
fd60: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
fd70: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fd80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
fd90: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
fda0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
fdb0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
fdc0: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
fdd0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
fde0: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
fdf0: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
fe00: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
fe10: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
fe20: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
fe30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
fe40: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
fe50: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
fe60: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
fe70: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
fe80: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
fe90: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
fea0: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
feb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
fec0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
fed0: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
fee0: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
fef0: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
ff00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
ff10: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
ff20: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
ff30: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
ff40: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
ff50: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
ff60: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
ff70: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
ff80: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
ff90: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
ffa0: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
ffb0: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
ffc0: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
ffd0: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
ffe0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
fff0: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
10000 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
10010 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
10020 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
10030 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
10040 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
10050 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
10060 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
10070 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
10080 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
10090 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
100a0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
100b0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
100c0 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
100d0 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
100e0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
100f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
10100 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
10110 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
10120 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
10130 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
10140 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
10150 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
10160 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
10170 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
10180 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
10190 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
101a0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
101b0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
101c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
101d0 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
101e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
101f0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10200 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10210 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10220 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10230 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
10240 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
10250 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
10260 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
10270 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
10280 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
10290 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
102a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
102b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
102c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
102d0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
102e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
102f0 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10300 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10310 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10320 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10330 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
10340 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
10350 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
10360 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
10370 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
10380 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
10390 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
103a0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
103b0 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
103c0 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
103d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
103e0 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
103f0 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
10400 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
10410 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
10420 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10430 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
10440 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
10450 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
10460 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
10470 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
10480 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
10490 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
104a0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
104b0 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
104c0 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
104d0 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
104e0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
104f0 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
10500 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
10510 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
10520 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
10530 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
10540 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
10550 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
10560 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
10570 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
10580 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
10590 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
105a0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
105b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
105c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
105d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
105e0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
105f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10600 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10610 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10620 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
10630 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
10640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10650 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10670 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
10680 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
10690 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
106a0 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
106b0 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
106c0 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
106d0 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
106e0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
106f0 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
10700 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
10710 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
10720 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
10730 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
10740 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
10750 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
10760 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
10770 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
10780 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
10790 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
107a0 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
107b0 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
107c0 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
107d0 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
107e0 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
107f0 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
10800 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
10810 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
10820 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
10830 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10840 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
10850 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
10860 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
10870 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c  (Btree *p, int l
10880 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79  evel, int fullSy
10890 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  nc){.  BtShared 
108a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
108b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
108c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
108d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
108e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
108f0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
10900 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
10910 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
10920 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
10930 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10940 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10950 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10960 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
10970 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
10980 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
10990 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
109a0 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
109b0 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
109c0 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
109d0 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
109e0 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
109f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10a00 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
10a10 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
10a20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
10a30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
10a40 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10a50 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10a60 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
10a70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10a80 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
10a90 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
10aa0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
10ab0 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
10ac0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
10ad0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10ae0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
10af0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
10b00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
10b10 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
10b20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10b30 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
10b40 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
10b50 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
10b60 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
10b70 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
10b80 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
10b90 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
10ba0 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
10bb0 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
10bc0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
10bd0 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
10be0 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
10bf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10c00 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
10c10 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
10c20 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
10c30 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
10c40 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
10c50 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
10c60 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
10c70 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
10c80 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
10c90 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
10ca0 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
10cb0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
10cc0 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
10cd0 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
10ce0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10cf0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
10d00 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
10d10 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
10d20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
10d30 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
10d40 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
10d50 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
10d60 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
10d70 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
10d80 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
10d90 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
10da0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
10db0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
10dc0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
10dd0 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
10de0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
10df0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
10e00 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
10e10 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  e pageSizeFixed 
10e20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
10e30 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
10e40 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
10e50 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
10e60 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
10e70 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10e80 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
10e90 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
10ea0 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
10eb0 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
10ec0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
10ee0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
10ef0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
10f00 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
10f10 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
10f20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10f30 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
10f40 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
10f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
10f60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
10f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
10f80 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
10f90 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
10fa0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
10fb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
10fc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
10fd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
10fe0 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
10ff0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11000 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
11010 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
11020 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11030 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
11040 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
11050 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
11060 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
11070 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
11080 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
11090 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
110a0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
110b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
110c0 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
110d0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
110e0 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
110f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11100 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11110 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11120 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11130 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
11140 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
11150 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
11160 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
11170 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11180 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  xed = 1;.  sqlit
11190 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
111a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
111b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
111c0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
111d0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
111e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
111f0 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
11200 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
11210 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
11220 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
11230 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
11240 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
11250 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
11260 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
11270 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
11280 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
11290 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
112a0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
112b0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
112c0 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
112d0 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
112e0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
112f0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
11300 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11310 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11320 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
11330 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
11340 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
11350 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11360 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
11370 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11380 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
11390 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
113a0 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
113b0 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
113c0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
113d0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
113e0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
113f0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
11400 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
11410 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
11420 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11440 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
11450 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
11460 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
11470 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11480 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
11490 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
114a0 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
114b0 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
114c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
114d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
114e0 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn n;.}.#endif /
114f0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
11500 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
11510 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
11520 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
11530 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
11540 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
11550 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
11560 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
11570 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
11580 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
11590 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
115a0 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
115b0 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
115c0 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
115d0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
115e0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
115f0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
11600 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
11610 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
11620 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
11630 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
11640 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
11650 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
11660 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
11670 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
11680 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
11690 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
116a0 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
116b0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
116c0 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
116d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
116e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
116f0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
11700 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
11710 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11720 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
11730 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26  pageSizeFixed &&
11740 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
11750 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
11760 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
11770 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
11780 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
11790 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
117a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
117b0 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
117c0 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
117d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
117e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
117f0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
11800 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
11810 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
11820 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
11830 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
11840 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
11850 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
11860 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
11870 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
11880 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
11890 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
118a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
118b0 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
118c0 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
118d0 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
118e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
118f0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
11900 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
11910 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
11920 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
11930 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
11940 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
11950 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
11960 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
11970 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
11980 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11990 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
119a0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
119b0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
119c0 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
119d0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
119e0 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
119f0 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
11a00 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
11a10 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
11a20 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
11a30 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
11a40 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
11a50 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
11a60 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
11a70 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
11a80 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
11a90 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
11aa0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
11ab0 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
11ac0 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
11ad0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
11ae0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
11af0 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
11b00 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
11b10 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
11b20 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
11b30 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
11b40 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
11b50 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72   nPage;..  asser
11b60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11b70 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11b80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11b90 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
11ba0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
11bb0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
11bc0 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
11bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11be0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
11bf0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
11c00 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
11c10 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
11c20 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
11c30 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
11c40 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
11c50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11c60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
11c70 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
11c80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
11ca0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11cb0 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  iled;.  }else if
11cc0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
11cd0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20   int pageSize;. 
11ce0 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
11cf0 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
11d00 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
11d10 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
11d20 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66  E_NOTADB;.    if
11d30 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
11d40 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
11d50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
11d60 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11d70 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
11d80 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
11d90 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
11da0 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
11db0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
11dc0 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
11dd0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
11de0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
11df0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
11e00 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
11e10 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
11e20 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
11e30 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
11e40 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
11e50 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
11e60 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
11e70 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
11e80 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
11e90 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
11ea0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
11eb0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
11ec0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
11ed0 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
11ee0 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
11ef0 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
11f00 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
11f10 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
11f20 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
11f30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
11f40 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
11f50 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
11f60 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
11f70 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
11f80 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
11f90 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
11fa0 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
11fb0 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
11fc0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11fd0 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
11fe0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
11ff0 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
12000 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12010 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12020 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
12030 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
12040 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
12050 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
12060 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
12070 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21     if( pageSize!
12080 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
12090 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
120a0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
120b0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
120c0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
120d0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
120e0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
120f0 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
12100 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
12110 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
12120 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
12130 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
12140 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
12150 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
12160 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
12170 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
12180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
12190 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
121a0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
121b0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
121c0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
121d0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
121e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
121f0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
12200 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
12210 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
12220 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
12230 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
12240 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
12250 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
12260 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
12270 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12280 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
12290 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
122a0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
122d0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
122e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
122f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
12300 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
12310 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12320 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12330 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
12340 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
12350 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
12360 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
12370 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
12380 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12390 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
123a0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
123b0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
123c0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
123d0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
123e0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
123f0 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
12400 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
12410 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
12420 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
12430 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
12440 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
12450 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
12460 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
12470 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
12480 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
12490 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
124a0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
124b0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
124c0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
124d0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
124e0 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
124f0 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
12500 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
12510 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
12520 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
12530 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
12540 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
12550 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
12560 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
12570 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
12580 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
12590 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
125a0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
125b0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
125c0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
125d0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
125e0 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20  oiner, a header 
125f0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
12600 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
12610 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
12620 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
12630 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
12640 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
12650 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
12660 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
12670 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  maxLocal = (pBt-
12680 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
12690 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  64/255 - 23;.  p
126a0 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28  Bt->minLocal = (
126b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
126c0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
126d0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
126e0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
126f0 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d  e - 35;.  pBt->m
12700 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75  inLeaf = (pBt->u
12710 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
12720 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73  /255 - 23;.  ass
12730 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
12740 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
12750 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
12760 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
12770 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
12780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
12790 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
127a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
127b0 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
127c0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
127d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
127e0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
127f0 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
12800 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
12810 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
12820 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
12830 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
12840 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
12850 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
12860 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
12870 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
12880 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
12890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
128a0 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
128b0 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
128c0 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
128d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
128e0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
128f0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
12900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12910 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12920 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
12930 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
12940 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
12950 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12960 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
12970 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
12980 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
12990 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
129a0 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
129b0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
129c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
129d0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
129e0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
129f0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12a00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
12a10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
12a20 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
12a30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
12a40 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12a50 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
12a60 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65  Data );.    rele
12a70 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
12a80 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge1);.    pBt->p
12a90 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Page1 = 0;.  }.}
12aa0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
12ab0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 62 79   new database by
12ac0 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
12ad0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
12ae0 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  the.** file..*/.
12af0 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
12b00 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
12b10 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
12b20 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
12b30 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
12b40 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50  int rc;.  int nP
12b50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
12b60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12b70 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12b80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12b90 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12ba0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
12bb0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
12bc0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67  QLITE_OK || nPag
12bd0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
12be0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20  n rc;.  }.  pP1 
12bf0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
12c00 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
12c10 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
12c20 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
12c30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
12c40 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
12c50 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12c60 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
12c70 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
12c80 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
12c90 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
12ca0 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
12cb0 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
12cc0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
12cd0 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
12ce0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
12cf0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
12d00 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
12d10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
12d20 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
12d30 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
12d40 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
12d50 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
12d60 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
12d70 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
12d80 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
12d90 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
12da0 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
12db0 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
12dc0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
12dd0 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
12de0 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
12df0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
12e00 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
12e10 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
12e20 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
12e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12e40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
12e50 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
12e60 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
12e70 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
12e80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12e90 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
12ea0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12eb0 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
12ec0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
12ed0 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
12ee0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
12ef0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
12f00 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12f10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
12f20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12f30 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
12f40 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
12f50 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
12f60 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
12f70 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
12f80 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12f90 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
12fa0 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
12fb0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
12fc0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
12fd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
12fe0 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
12ff0 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
13000 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
13010 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
13020 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
13030 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
13040 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
13050 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
13060 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
13070 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
13080 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
13090 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
130a0 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
130b0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
130c0 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
130d0 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
130e0 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
130f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
13100 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
13110 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
13120 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
13130 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
13140 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13150 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
13160 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
13170 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
13180 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
13190 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
131a0 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
131b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
131c0 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
131d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
131e0 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
131f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13200 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
13210 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13220 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
13230 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13240 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
13250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13260 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
13270 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
13280 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
13290 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
132a0 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
132b0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
132c0 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
132d0 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
132e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
132f0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
13300 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
13310 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13320 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
13330 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
13340 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
13350 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
13360 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
13370 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13380 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
13390 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
133a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
133b0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
133c0 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
133d0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
133e0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
133f0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
13400 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
13410 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
13420 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
13430 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
13440 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
13450 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
13460 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
13470 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
13480 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
13490 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
134a0 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
134b0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
134c0 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
134d0 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
134e0 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
134f0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
13500 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
13510 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
13520 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
13530 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
13540 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
13550 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
13560 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
13570 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
13580 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
13590 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
135a0 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
135b0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
135c0 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
135d0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
135e0 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
135f0 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
13600 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
13610 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13620 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13630 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13640 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
13650 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
13660 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13670 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
13680 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
13690 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
136a0 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
136b0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
136c0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
136d0 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
136e0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
136f0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
13700 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
13710 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
13720 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
13730 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
13740 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
13750 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
13760 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
13770 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
13780 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
13790 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
137a0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
137b0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
137c0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
137d0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
137e0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
137f0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
13800 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
13810 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13820 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13830 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
13840 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13850 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
13860 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
13870 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
13880 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
13890 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
138a0 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
138b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
138c0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
138d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
138e0 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
138f0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
13900 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
13910 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
13920 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
13930 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
13940 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
13950 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
13960 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
13970 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
13980 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
13990 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
139a0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
139b0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
139c0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
139d0 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
139e0 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
139f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13a10 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
13a20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
13a30 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
13a40 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
13a50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13a60 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
13a70 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
13a80 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
13a90 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
13aa0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
13ab0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
13ac0 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
13ad0 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
13ae0 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
13af0 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
13b00 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
13b10 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
13b20 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
13b30 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
13b40 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
13b50 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
13b60 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
13b70 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
13b80 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
13b90 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
13ba0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
13bb0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
13bc0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
13bd0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
13be0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
13bf0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
13c00 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
13c10 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
13c20 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
13c30 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
13c40 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
13c50 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
13c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
13c70 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
13c80 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
13c90 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
13ca0 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
13cb0 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
13cc0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
13cd0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
13ce0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
13cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
13d00 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
13d10 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
13d20 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
13d30 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
13d40 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
13d50 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
13d60 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
13d70 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
13d80 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
13d90 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
13da0 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
13db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13dc0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
13dd0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
13de0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
13df0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
13e00 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
13e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13e20 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
13e30 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
13e40 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
13e50 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
13e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e80 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
13e90 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
13ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13eb0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
13ec0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13ed0 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
13ee0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
13ef0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
13f00 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
13f10 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
13f20 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13f30 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
13f40 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
13f50 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
13f60 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
13f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
13f80 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13f90 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
13fa0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13fb0 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
13fc0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13fd0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
13fe0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
13ff0 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b  .assert( p->lock
14000 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
14010 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
14020 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
14030 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
14040 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
14050 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
14060 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
14070 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
14080 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
14090 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
140a0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
140b0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
140c0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
140d0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
140e0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
140f0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
14100 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14110 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
14120 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14130 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14140 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77  _CACHE.    if( w
14150 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  rflag ){.      a
14160 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
14170 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
14180 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
14190 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63        pBt->isExc
141a0 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72  lusive = (u8)(wr
141b0 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23  flag>1);.    }.#
141c0 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e  endif.  }...tran
141d0 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
141e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
141f0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
14200 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
14210 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
14220 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
14230 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
14240 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
14250 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
14260 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
14270 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
14280 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
14290 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
142a0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
142b0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
142c0 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
142d0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
142e0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
142f0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
14300 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
14310 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
14320 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14330 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14340 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
14360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14370 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
14380 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
14390 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
143a0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
143b0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
143c0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
143d0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
143e0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
143f0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
14400 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
14410 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
14420 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
14430 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
14440 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
14450 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
14460 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
14470 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14490 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
144a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
144b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
144c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
144d0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
144e0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
144f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14520 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
14530 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
14540 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
14550 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
14560 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
14570 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
14580 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14590 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
145a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
145b0 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
145c0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
145d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
145e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
145f0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
14600 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
14610 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
14620 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
14630 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
14640 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
14650 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
14660 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
14670 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
14680 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
14690 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
146a0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
146b0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
146c0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
146d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
146e0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
146f0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
14700 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
14710 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
14720 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
14730 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
14740 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14750 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14760 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
14770 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
14780 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
14790 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
147a0 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
147b0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
147c0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
147d0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
147e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
147f0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
14800 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
14810 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
14820 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
14830 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
14840 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
14850 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
14860 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
14870 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
14880 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
14890 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
148a0 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
148b0 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
148c0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
148d0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
148e0 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
148f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14900 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
14910 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
14920 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
14930 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
14940 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
14950 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
14960 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
14970 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
14980 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
14990 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
149a0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
149b0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
149c0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
149d0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
149e0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
149f0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
14a10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
14a20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
14a30 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
14a40 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
14a50 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
14a60 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
14a70 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
14a80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14a90 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14aa0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14ab0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
14ac0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
14ad0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
14ae0 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
14af0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
14b00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
14b10 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
14b20 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14b30 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
14b40 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
14b50 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
14b60 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
14b70 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
14b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14b90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14ba0 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
14bb0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
14bc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14bd0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
14be0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
14bf0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
14c00 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74  t nCell;..    bt
14c10 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
14c20 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  e);.    nCell = 
14c30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
14c40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14c50 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
14c60 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
14c70 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
14c80 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
14c90 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
14ca0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
14cb0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
14cc0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
14cd0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
14ce0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
14cf0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
14d00 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
14d10 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
14d20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
14d30 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
14d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14d50 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
14d60 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
14d70 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
14d80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14da0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14db0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
14dc0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
14dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
14de0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
14df0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
14e00 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
14e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14e20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
14e30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
14e40 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
14e50 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
14e60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
14e70 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14e80 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
14e90 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
14ea0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14eb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
14ec0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
14ed0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
14ee0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
14ef0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
14f00 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
14f10 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
14f20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
14f30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
14f40 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
14f50 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
14f60 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
14f70 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
14f80 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
14f90 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
14fa0 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
14fb0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
14fc0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
14fd0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
14fe0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
14ff0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
15000 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
15010 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
15020 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
15030 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
15040 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
15050 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
15060 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
15070 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
15080 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
15090 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
150a0 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
150b0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
150c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
150d0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
150e0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
150f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
15100 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
15110 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
15120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15130 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
15140 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
15150 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
15160 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
15170 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
15180 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
15190 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
151a0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
151b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
151c0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
151d0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
151e0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
151f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
15200 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
15210 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
15220 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
15230 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
15240 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
15250 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
15260 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
15270 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15280 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
15290 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
152a0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
152b0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
152c0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
152d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
152e0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
152f0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
15300 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
15310 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
15320 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
15330 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
15340 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15350 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15360 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
15370 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
15380 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
15390 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
153a0 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
153b0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
153c0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
153d0 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
153e0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
153f0 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
15400 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
15410 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
15420 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
15430 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
15440 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
15450 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15460 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
15470 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
15480 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
15490 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
154a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
154b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
154c0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
154d0 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
154e0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
154f0 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
15500 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
15510 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
15520 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
15530 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
15540 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
15550 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
15560 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
15570 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
15580 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
15590 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
155a0 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
155b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
155c0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
155d0 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
155e0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
155f0 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
15600 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
15610 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15620 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
15630 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
15640 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
15650 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
15660 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
15670 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
15680 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
15690 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
156a0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
156b0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
156c0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
156d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
156e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
156f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15700 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
15710 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
15720 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
15730 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
15740 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
15750 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
15760 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
15770 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
15780 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
15790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
157a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
157b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
157c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
157d0 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
157e0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
157f0 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
15800 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
15810 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
15820 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
15830 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
15840 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
15850 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
15860 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
15870 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
15880 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
15890 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
158a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
158b0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
158c0 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
158d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
158e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
158f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
15900 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15910 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
15920 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
15930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15940 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
15950 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
15960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15970 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
15980 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
15990 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
159a0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
159b0 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
159c0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
159d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
159e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
159f0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15a00 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
15a10 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
15a20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
15a30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
15a40 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
15a50 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
15a60 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
15a70 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
15a80 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
15a90 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
15aa0 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
15ab0 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
15ac0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
15ad0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
15ae0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
15af0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
15b00 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
15b10 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
15b20 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
15b30 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
15b40 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
15b50 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
15b60 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
15b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15b80 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
15b90 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
15ba0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
15bb0 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
15bc0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
15bd0 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
15be0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
15bf0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
15c00 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
15c10 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
15c20 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
15c30 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
15c40 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ro, the implemen
15c50 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  tation assumes.*
15c60 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
15c70 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
15c80 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
15c90 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
15ca0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
15cb0 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
15cc0 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
15cd0 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
15ce0 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
15cf0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
15d00 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
15d10 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
15d20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a  is complete..*/.
15d30 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
15d40 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
15d50 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
15d60 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
15d70 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
15d80 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
15d90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
15da0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
15db0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
15dc0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15dd0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15de0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
15df0 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
15e00 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
15e10 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
15e20 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
15e30 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
15e40 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
15e50 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20   int rc;.    u8 
15e60 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
15e70 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
15e80 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
15e90 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
15ea0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
15eb0 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
15ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
15ed0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
15ee0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
15ef0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
15f00 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
15f10 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
15f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15f30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
15f40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15f50 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15f60 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
15f70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15f80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
15f90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
15fa0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
15fb0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
15fc0 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
15fd0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
15fe0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
15ff0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
16000 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
16010 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
16020 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f  ** if nFin is no
16030 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
16040 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
16050 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
16060 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
16070 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
16080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
16090 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
160a0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
160b0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
160c0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
160d0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
160e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
160f0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
16100 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
16110 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
16120 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
16130 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
16140 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
16150 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29  ePg, iLastPg, 1)
16160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16170 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16180 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16190 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
161a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
161b0 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
161c0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
161d0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
161e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
161f0 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
16200 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
16210 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
16220 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
16230 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
16240 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
16250 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20  pLastPg;..      
16260 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
16270 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
16280 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
16290 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
162a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
162b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
162c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
162d0 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74   nFin is zero, t
162e0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
162f0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
16300 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
16310 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
16320 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
16330 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
16340 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
16350 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
16360 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
16370 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20  r hand, if nFin 
16380 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16390 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
163a0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
163b0 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
163c0 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
163d0 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
163e0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
163f0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
16400 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
16410 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
16420 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
16430 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
16440 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
16450 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
16460 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30  , &iFreePg, 0, 0
16470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16480 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16490 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
164a0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
164b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
164c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
164d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
164e0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
164f0 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21     }while( nFin!
16500 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  =0 && iFreePg>nF
16510 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
16520 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
16530 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
16540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16550 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74  PagerWrite(pLast
16560 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
16570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16590 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
165a0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
165b0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
165c0 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21  , iFreePg, nFin!
165d0 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
165e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
165f0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
16600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16610 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
16620 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
16630 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
16640 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nFin==0 ){.    i
16650 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68  LastPg--;.    wh
16660 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
16670 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
16680 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50  pBt)||PTRMAP_ISP
16690 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
166a0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  ) ){.      if( P
166b0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
166c0 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
166d0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
166e0 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Pg;.        int 
166f0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
16700 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
16710 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
16720 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16730 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
16760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16770 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
16780 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
16790 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
167a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
167b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
167c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
167d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
167e0 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  }.      iLastPg-
167f0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
16800 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
16810 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
16820 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
16830 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16840 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16850 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
16860 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
16870 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
16880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
16890 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
168a0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
168b0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
168c0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
168d0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
168e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
168f0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
16900 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
16910 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
16920 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16930 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
16940 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
16950 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
16960 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
16970 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16980 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
16990 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
169a0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
169b0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
169c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
169d0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
169e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
169f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16a00 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
16a10 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
16a20 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
16a30 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
16a40 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
16a50 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
16a60 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
16a70 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
16a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
16a90 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
16aa0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
16ab0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
16ac0 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
16ad0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16ae0 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
16af0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16b10 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16b20 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
16b30 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
16b40 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
16b50 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
16b60 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
16b70 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
16b80 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
16b90 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16ba0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
16bb0 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
16bc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16bd0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
16be0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
16bf0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
16c00 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
16c10 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
16c20 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
16c30 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
16c40 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
16c50 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
16c60 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
16c70 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
16c80 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
16c90 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
16ca0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
16cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16cc0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16cd0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
16ce0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
16cf0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
16d00 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
16d10 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
16d20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16d30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16d40 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
16d50 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
16d60 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
16d70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
16d80 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
16d90 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
16da0 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
16db0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
16dc0 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
16dd0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
16de0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
16df0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 6f  mber of pages no
16e00 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
16e10 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  .    Pgno nPtrma
16e20 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  p;      /* Numbe
16e30 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
16e40 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
16e50 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
16e60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
16e70 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
16e80 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  reed */.    int 
16e90 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f  nEntry;        /
16ea0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
16eb0 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
16ec0 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  p page */.    Pg
16ed0 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
16ee0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
16ef0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
16f00 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
16f10 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
16f20 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
16f30 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16f40 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
16f50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
16f60 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
16f70 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
16f80 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
16f90 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
16fa0 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
16fb0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
16fc0 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
16fd0 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
16fe0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
16ff0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
17000 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
17010 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
17020 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
17030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17050 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
17060 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
17070 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
17080 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
17090 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70  ;.    nEntry = p
170a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
170b0 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20  ;.    nPtrmap = 
170c0 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
170d0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
170e0 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
170f0 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20  Entry;.    nFin 
17100 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
17110 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
17120 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
17130 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
17140 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
17150 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
17160 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
17170 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
17180 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
17190 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
171a0 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
171b0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
171c0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
171d0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
171e0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
171f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17200 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65  ;..    for(iFree
17210 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
17220 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
17230 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
17240 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
17250 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
17260 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20  in, iFree);.    
17270 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
17280 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
17290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
172a0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
172b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
172c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
172d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
172e0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
172f0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
17300 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
17310 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
17320 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
17330 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
17340 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
17350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
17360 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
17370 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
17380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
17390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
173a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
173b0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
173c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
173d0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
173e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
173f0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
17400 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
17410 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
17420 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17430 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
17440 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
17450 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
17460 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
17470 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
17480 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
17490 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
174a0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
174b0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
174c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
174d0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
174e0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
174f0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
17500 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
17510 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
17520 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
17530 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
17540 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
17550 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
17560 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
17570 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
17580 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
17590 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
175a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
175b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
175c0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
175d0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
175e0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
175f0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
17600 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
17610 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
17620 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
17630 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17640 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
17650 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
17660 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
17670 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
17680 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
17690 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
176a0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
176b0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
176c0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
176d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
176e0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
176f0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
17700 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17710 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
17720 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
17730 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
17740 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
17750 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
17760 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
17770 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
17780 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
17790 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
177a0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
177b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
177c0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
177d0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
177e0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
177f0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
17800 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
17810 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
17820 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
17830 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
17840 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
17850 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
17860 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17870 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
17880 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
17890 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
178a0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
178b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
178c0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
178d0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
178e0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
178f0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
17900 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
17910 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
17920 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
17930 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
17940 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
17950 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
17960 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
17970 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
17980 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
17990 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
179a0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
179b0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
179c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
179d0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
179e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
179f0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
17a00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17a10 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
17a20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
17a30 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
17a40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
17a50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17a60 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
17a70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17a80 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
17a90 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
17aa0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
17ab0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
17ac0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17ae0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17af0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
17b00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17b10 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
17b20 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
17b30 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
17b40 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
17b50 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
17b60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17b70 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
17b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17b90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17ba0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
17bb0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
17bc0 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
17bd0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
17be0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
17bf0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
17c00 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
17c10 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
17c20 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
17c30 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
17c40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17c50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b   BtCursor *pCsr;
17c60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17c70 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
17c80 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  x(p) );..  /* Se
17c90 61 72 63 68 20 66 6f 72 20 61 20 63 75 72 73 6f  arch for a curso
17ca0 72 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20 74  r held open by t
17cb0 68 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  his b-tree conne
17cc0 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78  ction. If one ex
17cd0 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ists,.  ** then 
17ce0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17cf0 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61 64  will be downgrad
17d00 65 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  ed to a read-onl
17d10 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  y transaction.  
17d20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63  ** instead of ac
17d30 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  tually concluded
17d40 2e 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63  . A subsequent c
17d50 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61  all to CommitPha
17d60 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72  seTwo() .  ** or
17d70 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c   Rollback() will
17d80 20 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e   finish the tran
17d90 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
17da0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
17db0 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d    */.  for(pCsr=
17dc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
17dd0 73 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72  sr && pCsr->pBtr
17de0 65 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73 72  ee!=p; pCsr=pCsr
17df0 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73 65  ->pNext);.  asse
17e00 72 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70  rt( pCsr==0 || p
17e10 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
17e20 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65 65  NONE );..  btree
17e30 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
17e40 70 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72  pBt);.  if( pCsr
17e50 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   ){.    downgrad
17e60 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
17e70 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
17e80 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
17e90 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
17ea0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
17eb0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
17ec0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
17ed0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
17ee0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
17ef0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17f00 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
17f10 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
17f20 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
17f30 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
17f40 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
17f50 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
17f60 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
17f70 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
17f80 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
17f90 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
17fa0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
17fb0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
17fc0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
17fd0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
17fe0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
17ff0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
18000 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
18010 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
18020 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
18030 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
18040 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18050 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
18060 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
18070 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
18080 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
18090 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
180a0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
180b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
180c0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
180d0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
180e0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
180f0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
18100 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
18110 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
18120 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
18130 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
18140 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
18150 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
18160 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
18170 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
18180 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
18190 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
181a0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
181b0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
181c0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
181d0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
181e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
181f0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
18200 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
18210 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
18220 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
18230 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
18240 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
18250 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
18260 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
18270 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
18280 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
18290 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
182a0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
182b0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
182c0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
182d0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
182e0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
182f0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
18300 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
18310 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
18320 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
18330 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
18340 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
18350 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
18360 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
18370 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
18380 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
18390 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
183a0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
183b0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
183c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
183d0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
183e0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
183f0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
18400 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
18410 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
18420 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18430 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
18440 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
18450 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
18460 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
18470 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
18480 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
18490 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
184a0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
184b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
184c0 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
184d0 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
184e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
184f0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
18500 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
18510 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
18520 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
18530 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
18540 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
18550 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
18560 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
18570 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
18580 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
18590 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
185a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
185b0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
185c0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
185d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
185e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
185f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18600 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18610 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
18620 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
18630 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
18640 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
18650 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
18660 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18670 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18680 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
18690 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
186a0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
186b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
186c0 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
186d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
186e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
186f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18700 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18710 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
18720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18730 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18740 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
18750 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20  seTwo(p);.  }.  
18760 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18770 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
18780 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
18790 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
187a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
187b0 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70  write-cursors op
187c0 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c  en on this handl
187d0 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  e. This is for u
187e0 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
187f0 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
18800 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
18810 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
18820 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
18830 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
18840 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
18850 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69  s routine, a wri
18860 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79  te-cursor is any
18870 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
18880 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72  is capable of wr
18890 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
188a0 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e  abse.  That mean
188b0 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  s the cursor was
188c0 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  .** originally o
188d0 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
188e0 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  g and the cursor
188f0 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61   has not be disa
18900 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e  bled.** by havin
18910 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e  g its state chan
18920 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ged to CURSOR_FA
18930 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULT..*/.static i
18940 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  nt countWriteCur
18950 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
18960 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
18970 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
18980 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
18990 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
189a0 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
189b0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
189c0 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43  ur->wrFlag && pC
189d0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
189e0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
189f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
18a00 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18a10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
18a20 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
18a30 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
18a40 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
18a50 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
18a60 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
18a70 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
18a80 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
18a90 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
18aa0 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
18ab0 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
18ac0 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
18ad0 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
18ae0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18af0 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
18b00 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
18b10 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
18b20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
18b30 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
18b40 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
18b50 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
18b60 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
18b70 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
18b80 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
18b90 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
18ba0 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
18bb0 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
18bc0 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
18bd0 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
18be0 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
18bf0 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
18c00 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
18c10 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
18c20 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
18c30 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
18c40 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
18c50 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
18c60 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
18c70 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
18c80 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
18c90 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
18ca0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
18cb0 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
18cc0 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  or *p;.  sqlite3
18cd0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
18ce0 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
18cf0 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
18d00 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
18d10 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
18d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
18d30 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
18d40 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
18d50 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
18d60 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
18d70 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
18d80 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
18d90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
18da0 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
18db0 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
18dc0 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
18dd0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
18de0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
18df0 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
18e00 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
18e10 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
18e20 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
18e30 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
18e40 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
18e50 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
18e60 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
18e70 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
18e80 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
18e90 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
18ea0 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
18eb0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
18ec0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
18ed0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
18ee0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
18ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18f00 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
18f10 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
18f20 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
18f30 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
18f40 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
18f50 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
18f60 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
18f70 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
18f80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
18f90 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
18fa0 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
18fb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18fc0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
18fd0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
18fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18ff0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
19000 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
19010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
19020 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
19030 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
19040 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
19050 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
19060 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79  hilst.    ** try
19070 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73  ing to save curs
19080 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66  or positions. If
19090 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
190a0 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28  matic rollback (
190b0 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  as.    ** the re
190c0 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72  sult of a constr
190d0 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66  aint, malloc() f
190e0 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72  ailure or IO err
190f0 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  or) then .    **
19100 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62   the cache may b
19110 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63  e internally inc
19120 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63  onsistent (not c
19130 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65  ontain valid tre
19140 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  es) so.    ** we
19150 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72   cannot simply r
19160 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
19170 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49  to the caller. I
19180 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20  nstead, abort . 
19190 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65     ** all querie
191a0 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
191b0 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63  ing any of the c
191c0 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c  ursors that fail
191d0 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20  ed to save..    
191e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
191f0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
19200 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65  s(p, rc);.  }.#e
19210 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65  ndif.  btreeInte
19220 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
19230 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19240 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
19250 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
19260 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
19270 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
19280 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
19290 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
192a0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
192b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
192c0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
192d0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
192e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
192f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
19300 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
19310 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
19320 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
19330 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
19340 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
19350 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
19360 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
19370 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
19380 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
19390 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
193a0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
193b0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
193c0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
193d0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
193e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
193f0 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
19400 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20  rs(pBt)==0 );.  
19410 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
19420 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
19430 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
19440 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
19450 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19460 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19480 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
19490 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
194a0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
194b0 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20  tion can can be 
194c0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
194d0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
194e0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
194f0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
19500 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
19510 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
19520 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
19530 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
19540 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
19550 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
19560 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
19570 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
19580 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
19590 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
195a0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
195b0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
195c0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
195d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
195e0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
195f0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
19600 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
19610 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
19620 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
19630 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
19640 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
19650 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
19660 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
19670 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
19680 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
19690 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
196a0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
196b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
196c0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
196d0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
196e0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
196f0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
19700 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
19710 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
19720 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
19730 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
19740 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
19750 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
19760 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
19770 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
19780 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
19790 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
197a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
197b0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
197c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
197d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
197e0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
197f0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
19800 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
19810 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
19820 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
19830 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
19840 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
19850 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
19860 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19870 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
19880 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
19890 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
198a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
198b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
198c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
198d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
198e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
198f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
19900 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d   pBt->readOnly==
19910 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
19920 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
19930 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
19940 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
19950 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e  point );.  if( N
19960 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21  EVER(p->inTrans!
19970 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
19980 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  pBt->readOnly) )
19990 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
199a0 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65  E_INTERNAL;.  }e
199b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
199c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
199d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
199e0 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   );.    /* At th
199f0 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
19a00 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
19a10 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
19a20 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a  point with.    *
19a30 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
19a40 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
19a50 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
19a60 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
19a70 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65      ** SQL state
19a80 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
19a90 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
19aa0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
19ab0 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  k any.    ** suc
19ac0 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
19ad0 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
19ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
19af0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
19b00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
19b10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
19b20 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
19b30 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
19b40 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
19b50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19b60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19b70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
19b80 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
19b90 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
19ba0 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
19bb0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
19bc0 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
19bd0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
19be0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
19bf0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
19c00 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
19c10 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
19c20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
19c30 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
19c40 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
19c50 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
19c60 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
19c70 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
19c80 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
19c90 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
19ca0 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
19cb0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
19cc0 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
19cd0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
19ce0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
19cf0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
19d00 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
19d10 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
19d20 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
19d30 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
19d40 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
19d50 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
19d60 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
19d70 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
19d80 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
19d90 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
19da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19db0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
19dc0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
19dd0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
19de0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19df0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
19e00 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
19e10 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
19e20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19e30 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
19e40 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
19e50 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
19e60 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
19e70 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
19e80 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
19e90 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
19ea0 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
19eb0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
19ec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
19ed0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
19ee0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19ef0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
19f00 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
19f10 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
19f20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19f30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  ){.      rc = ne
19f40 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
19f50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19f60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19f70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19f90 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
19fa0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
19fb0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
19fc0 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
19fd0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
19fe0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
19ff0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1a000 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1a010 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1a020 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1a030 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1a040 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1a050 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1a060 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1a070 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1a080 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1a090 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1a0a0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1a0b0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1a0c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1a0d0 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1a0e0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1a0f0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1a100 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1a110 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1a120 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1a130 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1a140 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1a150 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1a160 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1a170 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1a180 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1a190 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1a1a0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1a1b0 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1a1c0 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1a1d0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1a1e0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1a1f0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1a200 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1a210 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1a220 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a230 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1a240 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1a250 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1a260 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1a270 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1a280 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1a290 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1a2a0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1a2b0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1a2c0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1a2d0 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1a2e0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1a2f0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1a300 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1a310 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1a320 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1a330 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1a340 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a350 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1a360 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1a370 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1a380 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1a390 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1a3a0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1a3b0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1a3c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1a3d0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1a3e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1a3f0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1a400 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1a410 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1a420 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1a430 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1a440 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1a450 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1a460 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1a470 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1a480 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1a490 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79  eCursorSize() by
1a4a0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a  tes of memory .*
1a4b0 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
1a4c0 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a  pCur have been z
1a4d0 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c  eroed by the cal
1a4e0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1a4f0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
1a500 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a530 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
1a540 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1a570 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1a580 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1a5b0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1a5c0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1a5d0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1a5e0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1a5f0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
1a600 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
1a610 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
1a620 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
1a650 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
1a660 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a670 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
1a680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1a690 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
1a6a0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1a6b0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1a6c0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
1a6d0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1a6e0 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b   || wrFlag==1 );
1a6f0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1a700 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
1a710 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
1a720 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
1a730 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
1a740 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
1a750 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
1a760 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
1a770 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
1a780 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
1a790 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
1a7a0 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
1a7b0 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
1a7c0 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
1a7d0 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
1a7e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
1a7f0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1a800 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
1a810 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72   pKeyInfo!=0, wr
1a820 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73  Flag+1) );.  ass
1a830 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1a840 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  | !hasReadConfli
1a850 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29  cts(p, iTable) )
1a860 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
1a870 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1a880 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65  as opened the re
1a890 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69  quired transacti
1a8a0 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on. */.  assert(
1a8b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1a8c0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65  S_NONE );.  asse
1a8d0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1a8e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a8f0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1a900 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
1a910 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  1 && pBt->pPage1
1a920 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66  ->aData );..  if
1a930 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26  ( NEVER(wrFlag &
1a940 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29  & pBt->readOnly)
1a950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a960 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1a970 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
1a980 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67 65  ==1 && pagerPage
1a990 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
1a9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a9b0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20  TE_EMPTY;.  }.. 
1a9c0 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
1a9d0 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
1a9e0 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
1a9f0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
1aa00 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
1aa10 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
1aa20 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
1aa30 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
1aa40 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
1aa50 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
1aa60 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
1aa70 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
1aa80 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
1aa90 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
1aaa0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
1aab0 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
1aac0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20   pCur->wrFlag = 
1aad0 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43  (u8)wrFlag;.  pC
1aae0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
1aaf0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20  >pCursor;.  if( 
1ab00 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1ab10 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e     pCur->pNext->
1ab20 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20  pPrev = pCur;.  
1ab30 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  }.  pBt->pCursor
1ab40 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
1ab50 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
1ab60 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72  _INVALID;.  pCur
1ab70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1ab80 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
1ab90 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
1aba0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1abb0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1abe0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1abf0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1ac30 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1ac40 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1ac70 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1ac80 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1ac90 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1aca0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1acb0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1acc0 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
1acd0 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
1ace0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
1ad10 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
1ad20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1ad30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1ad40 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
1ad50 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
1ad60 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
1ad70 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
1ad80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ad90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1ada0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1adb0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
1adc0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1add0 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
1ade0 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
1adf0 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
1ae00 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
1ae10 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
1ae20 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
1ae30 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
1ae40 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
1ae50 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1ae60 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
1ae70 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
1ae80 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
1ae90 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
1aea0 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
1aeb0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1aec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1aed0 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
1aee0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  oid){.  return s
1aef0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b  izeof(BtCursor);
1af00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1af10 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76  e cached rowid v
1af20 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75  alue of every cu
1af30 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65  rsor in the same
1af40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1af50 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61  * as pCur and ha
1af60 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f  ving the same ro
1af70 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ot page number a
1af80 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c  s pCur.  The val
1af90 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
1afa0 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  iRowid..**.** On
1afb0 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69  ly positive rowi
1afc0 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  d values are con
1afd0 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f  sidered valid fo
1afe0 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a  r this cache..**
1aff0 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   The cache is in
1b000 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1b010 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  o, indicating an
1b020 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a   invalid cache..
1b030 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20  ** A btree will 
1b040 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a  work fine with z
1b050 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1b060 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74  rowids.  We just
1b070 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65   cannot.** cache
1b080 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b090 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20  e rowids, which 
1b0a0 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61  means tables tha
1b0b0 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a  t use zero or.**
1b0c0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1b0d0 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
1b0e0 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74  tle slower.  But
1b0f0 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65   in practice, ze
1b100 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76  ro.** or negativ
1b110 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72  e rowids are ver
1b120 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68  y uncommon so th
1b130 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  is should not be
1b140 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
1b150 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1b160 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  SetCachedRowid(B
1b170 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73  tCursor *pCur, s
1b180 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
1b190 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  wid){.  BtCursor
1b1a0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75   *p;.  for(p=pCu
1b1b0 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  r->pBt->pCursor;
1b1c0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1b1d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
1b1e0 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  Root==pCur->pgno
1b1f0 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64  Root ) p->cached
1b200 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1b210 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1b220 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d  ur->cachedRowid=
1b230 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a  =iRowid );.}../*
1b240 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1b250 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20  ached rowid for 
1b260 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
1b270 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72  .  A negative or
1b280 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20   zero.** return 
1b290 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
1b2a0 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63  that the rowid c
1b2b0 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20  ache is invalid 
1b2c0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  and should be.**
1b2d0 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68   ignored.  If th
1b2e0 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61  e rowid cache ha
1b2f0 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
1b300 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a  een set, then a.
1b310 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  ** zero is retur
1b320 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
1b330 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72  int64 sqlite3Btr
1b340 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeGetCachedRowid
1b350 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b360 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  {.  return pCur-
1b370 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a  >cachedRowid;.}.
1b380 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1b390 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
1b3a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b3b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1b3c0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
1b3d0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
1b3e0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
1b3f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
1b400 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
1b410 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
1b420 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
1b430 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
1b440 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
1b450 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
1b460 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1b470 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1b480 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1b490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1b4a0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1b4b0 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
1b4c0 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
1b4d0 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
1b4e0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
1b4f0 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
1b500 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
1b510 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
1b520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b530 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1b540 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
1b550 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
1b560 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
1b570 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
1b580 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1b590 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b5a0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1b5b0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
1b5c0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b5d0 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61  d(pBt);.    inva
1b5e0 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1b5f0 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f  che(pCur);.    /
1b600 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
1b610 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
1b620 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b630 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1b640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b650 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
1b660 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
1b670 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1b680 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
1b690 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
1b6a0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1b6b0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
1b6c0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
1b6d0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
1b6e0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
1b6f0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
1b700 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
1b710 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
1b720 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
1b730 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
1b740 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
1b750 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
1b760 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
1b770 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1b780 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1b790 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1b7a0 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1b7b0 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1b7c0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1b7d0 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1b7e0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1b7f0 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1b800 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1b810 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1b820 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1b830 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1b840 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1b850 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1b860 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1b870 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1b880 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1b890 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1b8a0 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1b8b0 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1b8c0 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1b8d0 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1b8e0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1b8f0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1b900 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1b910 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1b920 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1b930 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1b940 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1b950 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1b960 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1b970 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1b980 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1b990 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1b9a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1b9b0 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
1b9c0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1b9d0 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
1b9e0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
1b9f0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
1ba00 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
1ba10 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
1ba20 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
1ba30 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
1ba40 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
1ba50 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
1ba60 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
1ba70 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
1ba80 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
1ba90 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
1baa0 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
1bab0 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
1bac0 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
1bad0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1bae0 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
1baf0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1bb00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50   ){.      int iP
1bb10 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1bb20 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  e;.      btreePa
1bb30 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1bb40 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1bb50 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1bb60 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
1bb70 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1bb80 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ey = 1;.    }els
1bb90 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
1bba0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1bbb0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
1bbc0 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
1bbd0 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
1bbe0 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
1bbf0 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
1bc00 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
1bc10 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
1bc20 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
1bc30 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
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 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bc70 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
1bc80 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
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 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
1bcd0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
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 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73   \.    btreePars
1bd20 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1bd30 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1bd40 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1bd50 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20  ur->info); \.   
1bd60 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1bd70 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1bdb0 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1be00 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1be10 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20  o(pCur);        
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1be50 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d    }.#endif /* _M
1be60 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SC_VER */../*.**
1be70 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1be80 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1be90 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1bea0 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1beb0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1bec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1bed0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1bee0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1bef0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1bf00 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1bf10 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1bf20 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1bf30 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1bf40 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1bf50 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1bf60 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1bf70 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1bf80 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1bf90 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
1bfa0 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1bfb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1bfc0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1bfd0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1bfe0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1bff0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1c000 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1c010 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1c020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c030 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1c040 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1c050 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c060 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1c070 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1c080 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
1c090 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1c0a0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
1c0b0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
1c0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
1c0d0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1c0e0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
1c0f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1c100 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c110 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1c120 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
1c130 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1c140 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
1c150 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
1c160 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
1c170 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79 73  ints to.  Always
1c180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c190 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  K..** Failure is
1c1a0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1c1b0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1c1c0 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a   not currently.*
1c1d0 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  * pointing to an
1c1e0 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63 61   entry (which ca
1c1f0 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
1c200 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68 65  ample, if.** the
1c210 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
1c220 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65 20  ty) then *pSize 
1c230 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a  is set to 0..*/.
1c240 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c250 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1c260 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1c270 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
1c280 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1c290 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1c2a0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1c2b0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1c2c0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1c2d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c2e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1c2f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c300 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1c310 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c320 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
1c330 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c340 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1c350 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70  {.      /* Not p
1c360 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
1c370 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a  id entry - set *
1c380 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20  pSize to 0. */. 
1c390 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
1c3a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c3b0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1c3c0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
1c3d0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1c3e0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
1c3f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c400 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1c410 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1c420 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1c430 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c440 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1c450 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1c460 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1c470 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1c480 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1c490 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1c4a0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1c4b0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1c4c0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1c4d0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1c4e0 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1c4f0 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1c500 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1c510 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1c520 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1c530 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1c540 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1c550 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1c560 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1c570 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1c580 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1c590 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1c5a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1c5b0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1c5c0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1c5d0 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1c5e0 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1c5f0 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1c600 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1c610 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1c620 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1c630 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1c640 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1c650 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1c660 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1c670 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1c680 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1c690 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1c6a0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1c6b0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1c6c0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1c6d0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1c6e0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1c6f0 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1c700 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1c710 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1c720 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1c730 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1c740 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1c750 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1c760 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1c770 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1c780 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1c790 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1c7a0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1c7b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1c7c0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1c7d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7f0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1c800 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1c810 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1c820 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1c830 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1c840 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1c850 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1c860 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1c870 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1c880 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1c890 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c8b0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1c8c0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1c8d0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1c8e0 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1c8f0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1c900 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c910 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1c920 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1c930 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1c940 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1c950 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1c960 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1c970 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1c980 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1c990 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1c9a0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1c9b0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1c9c0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1c9d0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1c9e0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1c9f0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1ca00 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1ca10 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1ca20 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1ca30 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1ca40 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1ca50 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1ca60 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1ca70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1ca80 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1ca90 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1caa0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1cab0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1cac0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1cad0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1cae0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1caf0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1cb00 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1cb10 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1cb20 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1cb30 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1cb40 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1cb50 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1cb60 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1cb70 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
1cb80 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1cb90 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1cba0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1cbb0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1cbc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cbd0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1cbe0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1cbf0 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1cc00 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1cc10 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1cc20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1cc30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cc40 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1cc50 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1cc60 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1cc70 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cc80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1cc90 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1cca0 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1ccb0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1ccc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1ccd0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1cce0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ccf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1cd00 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1cd10 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1cd20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1cd30 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1cd40 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1cd50 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1cd60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1cd70 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1cd80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1cd90 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1cda0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1cdb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1cdc0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1cdd0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1cde0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1cdf0 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1ce00 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1ce10 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1ce20 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1ce30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1ce40 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1ce50 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1ce60 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1ce70 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1ce80 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1ce90 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1cea0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1ceb0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1cec0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1ced0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1cee0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1cef0 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1cf00 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1cf10 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1cf20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1cf30 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1cf40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1cf50 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1cf60 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1cf70 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1cf80 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1cf90 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1cfa0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1cfb0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1cfc0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1cfd0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1cff0 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1d000 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d030 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
1d040 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
1d050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
1d060 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
1d070 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
1d080 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
1d090 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
1d0a0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
1d0b0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
1d0c0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
1d0d0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1d0e0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
1d0f0 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
1d100 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1d110 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1d120 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
1d130 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1d140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d150 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d160 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1d170 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
1d180 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
1d190 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
1d1a0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
1d1b0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
1d1c0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1d1d0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
1d1e0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
1d1f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d200 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1d210 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d220 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
1d230 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
1d240 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1d250 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
1d260 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
1d270 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1d280 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
1d290 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
1d2a0 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
1d2b0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
1d2c0 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
1d2d0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1d2e0 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
1d2f0 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
1d300 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
1d310 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
1d320 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1d330 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
1d340 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
1d350 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
1d360 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
1d370 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
1d380 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1d390 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
1d3a0 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
1d3b0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
1d3c0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1d3d0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
1d3e0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1d3f0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1d400 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
1d410 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
1d420 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
1d430 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
1d440 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
1d450 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
1d460 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
1d470 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1d480 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1d490 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
1d4a0 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
1d4b0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
1d4c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1d4d0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
1d4e0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
1d4f0 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
1d500 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
1d510 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
1d520 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
1d530 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
1d540 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
1d550 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
1d560 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1d570 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1d580 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1d590 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
1d5a0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
1d5b0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
1d5c0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
1d5d0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
1d5e0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
1d5f0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
1d600 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
1d610 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
1d620 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
1d630 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
1d640 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
1d650 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1d660 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
1d670 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
1d680 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
1d690 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
1d6a0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
1d6b0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
1d6c0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
1d6d0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
1d6e0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
1d6f0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
1d700 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
1d710 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1d720 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1d730 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1d740 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1d750 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
1d760 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
1d770 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
1d780 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
1d790 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
1d7a0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
1d7b0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
1d7c0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
1d7d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
1d7e0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
1d7f0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
1d800 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
1d810 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1d820 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1d830 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1d840 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1d850 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1d860 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1d870 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1d880 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1d890 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1d8a0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1d8b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1d8c0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1d8d0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1d8e0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1d8f0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1d900 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1d910 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1d920 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1d930 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1d940 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1d950 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1d960 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d970 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1d980 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d990 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1d9a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1d9b0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d9c0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1d9d0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1d9e0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1d9f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1da00 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1da10 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1da20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1da30 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1da40 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1da50 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
1da60 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
1da70 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
1da80 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
1da90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1daa0 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
1dab0 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
1dac0 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
1dad0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
1dae0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
1daf0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
1db00 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
1db10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1db20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1db30 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
1db40 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
1db50 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
1db60 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
1db70 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
1db80 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
1db90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1dba0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1dbb0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
1dbc0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
1dbd0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
1dbe0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1dbf0 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
1dc00 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
1dc10 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1dc20 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1dc30 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
1dc40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
1dc50 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
1dc60 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
1dc70 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
1dc80 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
1dc90 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1dca0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1dcb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1dcc0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
1dcd0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
1dce0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1dcf0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
1dd00 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
1dd10 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
1dd20 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
1dd30 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1dd40 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
1dd50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
1dd60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1dd70 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1dd80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
1dd90 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1dda0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
1ddb0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
1ddc0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
1ddd0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1dde0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
1ddf0 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
1de00 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
1de10 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
1de20 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
1de30 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1de40 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
1de50 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
1de60 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
1de70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1de80 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
1de90 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
1dea0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
1deb0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
1dec0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
1ded0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
1dee0 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
1def0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
1df00 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
1df10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
1df20 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
1df30 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1df40 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
1df50 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
1df60 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
1df70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
1df80 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
1df90 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
1dfa0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
1dfb0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
1dfc0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
1dfd0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
1dfe0 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
1dff0 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
1e000 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
1e010 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
1e020 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
1e030 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
1e040 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
1e050 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
1e060 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
1e070 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1e080 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
1e090 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e0a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e0b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1e0c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1e0d0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1e0e0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
1e0f0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
1e100 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
1e110 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
1e120 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
1e130 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
1e140 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
1e150 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1e160 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1e170 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
1e180 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
1e190 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
1e1a0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
1e1b0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
1e1c0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1e1d0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
1e1e0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
1e1f0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
1e200 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
1e210 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
1e220 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
1e230 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
1e240 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1e250 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1e260 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
1e270 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
1e280 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1e290 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
1e2a0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1e2b0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1e2c0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
1e2d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e2e0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
1e2f0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
1e300 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1e310 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1e320 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
1e330 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1e340 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
1e350 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
1e360 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
1e370 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
1e380 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
1e390 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
1e3a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
1e3b0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
1e3c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1e3d0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1e3e0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1e3f0 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
1e400 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
1e410 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
1e420 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
1e430 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
1e440 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
1e450 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
1e460 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
1e470 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
1e480 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
1e490 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
1e4a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1e4b0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
1e4c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1e4d0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1e4e0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
1e4f0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1e500 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
1e510 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
1e520 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
1e530 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
1e540 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
1e550 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
1e560 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
1e570 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
1e580 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
1e590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e5a0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
1e5b0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
1e5c0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
1e5d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
1e5e0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
1e5f0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
1e600 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
1e610 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
1e620 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
1e630 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
1e640 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
1e650 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1e660 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e670 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
1e680 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
1e690 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
1e6a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e6b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e6c0 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
1e6d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1e6e0 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
1e6f0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
1e700 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
1e710 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
1e720 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
1e730 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
1e740 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
1e750 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
1e760 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e770 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
1e780 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1e790 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
1e7a0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
1e7b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1e7c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e7d0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
1e7e0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
1e7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
1e800 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
1e810 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
1e820 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e830 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
1e840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1e850 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
1e860 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e870 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
1e880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e890 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
1e8a0 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
1e8b0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1e8c0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1e8d0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1e8e0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1e8f0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1e900 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1e910 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1e920 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1e930 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1e940 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1e950 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1e960 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1e970 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1e980 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1e990 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1e9a0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1e9b0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1e9c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e9d0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
1e9e0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
1e9f0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
1ea00 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
1ea10 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1ea20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1ea30 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1ea40 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1ea50 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1ea60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ea70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1ea80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1ea90 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
1eaa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1eab0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1eac0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1ead0 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  e] );.    if( pC
1eae0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1eaf0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
1eb00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1eb10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1eb20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1eb30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1eb40 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1eb50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1eb60 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
1eb70 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
1eb80 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1eb90 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
1eba0 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 20 20  ar*)pBuf, 0);.  
1ebb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ebc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1ebd0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
1ebe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
1ebf0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
1ec00 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
1ec10 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
1ec20 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
1ec30 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
1ec40 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
1ec50 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
1ec60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1ec70 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
1ec80 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1ec90 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1eca0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
1ecb0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
1ecc0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
1ecd0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
1ece0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
1ecf0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
1ed00 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
1ed10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1ed20 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1ed30 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1ed40 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
1ed50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1ed60 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
1ed70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ed80 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1ed90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eda0 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
1edb0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
1edc0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1edd0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1ede0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1edf0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1ee00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ee10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1ee20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ee30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1ee40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1ee50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1ee60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1ee70 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
1ee80 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1ee90 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1eea0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1eeb0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1eec0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
1eed0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
1eee0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
1eef0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1ef00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1ef10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1ef20 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
1ef30 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
1ef40 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
1ef50 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
1ef60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
1ef70 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
1ef80 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1ef90 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
1efa0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
1efb0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1efc0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
1efd0 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
1efe0 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
1eff0 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
1f000 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
1f010 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
1f020 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
1f030 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
1f040 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
1f050 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
1f060 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
1f070 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f080 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
1f090 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
1f0a0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
1f0b0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
1f0c0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
1f0d0 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
1f0e0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
1f0f0 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
1f100 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
1f110 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
1f120 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
1f130 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
1f140 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
1f150 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
1f160 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
1f170 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
1f180 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
1f190 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
1f1a0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
1f1b0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
1f1c0 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
1f1d0 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
1f1e0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
1f1f0 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
1f200 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
1f210 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1f220 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
1f230 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
1f240 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
1f250 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
1f260 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
1f270 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
1f280 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
1f290 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
1f2a0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
1f2b0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
1f2c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1f2d0 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
1f2e0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1f2f0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1f300 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1f310 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1f320 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
1f330 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
1f340 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
1f350 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
1f360 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
1f370 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
1f380 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
1f390 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
1f3a0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
1f3b0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1f3c0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
1f3d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
1f3e0 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32   u32 nKey;.  u32
1f3f0 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
1f400 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
1f410 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1f420 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1f430 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
1f440 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f450 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f460 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
1f470 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f480 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
1f490 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1f4a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1f4b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1f4c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f4d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1f4e0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1f4f0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
1f500 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
1f510 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
1f520 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
1f530 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
1f540 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1f550 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
1f560 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
1f570 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1f580 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
1f590 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
1f5a0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
1f5b0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1f5c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1f5d0 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
1f5e0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1f5f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1f600 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
1f610 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
1f620 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
1f630 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
1f640 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
1f650 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
1f660 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
1f670 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1f680 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
1f690 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
1f6a0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
1f6b0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
1f6c0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
1f6d0 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
1f6e0 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
1f6f0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1f700 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
1f710 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
1f720 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1f730 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
1f740 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
1f750 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
1f760 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
1f770 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
1f780 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
1f790 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
1f7a0 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
1f7b0 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
1f7c0 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
1f7d0 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
1f7e0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
1f7f0 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
1f800 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
1f810 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
1f820 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
1f830 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
1f840 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
1f850 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
1f860 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
1f870 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1f880 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
1f890 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
1f8a0 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
1f8b0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
1f8c0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1f8d0 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1f8e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f8f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1f900 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1f910 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1f920 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f930 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1f940 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1f950 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1f960 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1f970 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1f980 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1f990 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1f9a0 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn 0;.}.const vo
1f9b0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1f9c0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
1f9d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1f9e0 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1f9f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1fa00 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1fa10 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1fa20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1fa30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fa40 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1fa50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fa60 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1fa70 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1fa80 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1fa90 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
1faa0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
1fab0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1fac0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
1fad0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
1fae0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
1faf0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1fb00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1fb10 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
1fb20 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
1fb30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1fb40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
1fb50 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
1fb60 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
1fb70 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
1fb80 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
1fb90 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
1fba0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
1fbb0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
1fbc0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
1fbd0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
1fbe0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
1fbf0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
1fc00 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
1fc10 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
1fc20 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
1fc30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1fc40 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
1fc50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1fc60 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1fc70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
1fc80 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
1fc90 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1fca0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1fcb0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fcc0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1fcd0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1fce0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1fcf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1fd00 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
1fd10 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28  X_DEPTH );.  if(
1fd20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
1fd30 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
1fd40 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
1fd50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1fd60 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63  T_BKPT;.  }.  rc
1fd70 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1fd80 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
1fd90 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66  &pNewPage);.  if
1fda0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1fdb0 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  ;.  pCur->apPage
1fdc0 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65  [i+1] = pNewPage
1fdd0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
1fde0 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  i+1] = 0;.  pCur
1fdf0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43  ->iPage++;..  pC
1fe00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1fe10 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1fe20 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1fe30 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
1fe40 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
1fe50 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
1fe60 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
1fe70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1fe80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1fe90 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1fea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1feb0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1fec0 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
1fed0 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
1fee0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
1fef0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1ff00 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
1ff10 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1ff20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
1ff30 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
1ff40 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
1ff50 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
1ff60 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
1ff70 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
1ff80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
1ff90 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
1ffa0 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
1ffb0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1ffc0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
1ffd0 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
1ffe0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1fff0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
20000 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
20010 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
20020 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
20030 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
20040 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
20050 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
20060 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
20070 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
20080 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
20090 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
200a0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
200b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
200c0 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
200d0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
200e0 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
200f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
20100 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
20110 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
20120 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
20130 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
20140 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
20150 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
20160 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
20170 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
20180 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
20190 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
201a0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
201b0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
201c0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
201d0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
201e0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
201f0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
20200 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
20210 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
20220 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
20230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20240 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
20250 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
20260 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
20270 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20290 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
202a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
202b0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
202c0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
202d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
202e0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
202f0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
20300 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
20310 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
20320 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
20330 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
20340 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
20350 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20360 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
20370 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
20380 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
20390 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
203a0 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
203b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
203c0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
203d0 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
203e0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
203f0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
20400 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
20410 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
20420 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
20430 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
20440 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
20450 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
20460 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
20470 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
20480 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
20490 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
204a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
204b0 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
204c0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
204d0 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
204e0 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
204f0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
20500 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
20510 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
20520 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
20530 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
20540 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
20550 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
20560 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
20570 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
20580 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
20590 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
205a0 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
205b0 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
205c0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
205d0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
205e0 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
205f0 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
20600 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
20610 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
20620 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
20630 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
20640 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
20650 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
20660 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
20670 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
20680 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
20690 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
206a0 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
206b0 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
206c0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
206d0 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
206e0 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
206f0 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
20700 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
20710 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
20720 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
20730 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
20740 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
20750 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
20760 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
20770 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
20780 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
20790 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
207a0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
207b0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
207c0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
207d0 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
207e0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
207f0 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
20800 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
20810 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
20820 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
20830 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
20840 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20850 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
20860 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
20870 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20880 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
20890 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
208a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
208b0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
208c0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
208d0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
208e0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
208f0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
20900 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
20910 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
20920 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
20930 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
20940 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
20950 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
20960 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
20970 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20980 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
20990 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
209a0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
209b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
209c0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
209d0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
209e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
209f0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
20a00 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
20a10 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
20a20 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
20a30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
20a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
20a50 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
20a60 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
20a70 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
20a80 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
20a90 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
20aa0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
20ab0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
20ac0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
20ad0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
20af0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
20b00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
20b10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20b20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
20b30 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Page = 0;..    /
20b40 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
20b50 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
20b60 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
20b70 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
20b80 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20  s cursor.    ** 
20b90 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
20ba0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
20bb0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
20bc0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
20bd0 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74  s.    ** NULL, t
20be0 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
20bf0 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
20c00 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
20c10 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a   the case,.    *
20c20 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
20c30 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
20c40 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
20c50 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
20c60 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  ]->intKey==1 || 
20c70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
20c80 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
20c90 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65    if( (pCur->pKe
20ca0 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d  yInfo==0)!=pCur-
20cb0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
20cc0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
20cd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20ce0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
20cf0 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  }..  /* Assert t
20d00 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  hat the root pag
20d10 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72  e is of the corr
20d20 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d  ect type. This m
20d30 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20  ust be the.  ** 
20d40 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c  case as the call
20d50 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20d60 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68  n that loaded th
20d70 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74  e root-page (eit
20d80 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61  her.  ** this ca
20d90 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73  ll or a previous
20da0 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75   invocation) wou
20db0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
20dc0 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a   corruption .  *
20dd0 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74  * if the assumpt
20de0 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75  ion were not tru
20df0 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  e, and it is not
20e00 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
20e10 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79  e flags .  ** by
20e20 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20  te to have been 
20e30 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74  modified while t
20e40 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f  his cursor is ho
20e50 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
20e60 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  e.  ** to the pa
20e70 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20  ge.  */.  pRoot 
20e80 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
20e90 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
20ea0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
20eb0 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73  pgnoRoot );.  as
20ec0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49  sert( pRoot->isI
20ed0 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b  nit && (pCur->pK
20ee0 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f  eyInfo==0)==pRoo
20ef0 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20  t->intKey );..  
20f00 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
20f10 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
20f20 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
20f30 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
20f40 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
20f50 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52  y = 0;..  if( pR
20f60 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
20f70 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
20f80 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
20f90 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
20fa0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
20fb0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20fc0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
20fd0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
20fe0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
20ff0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
21000 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
21010 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
21020 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
21030 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
21040 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
21050 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
21060 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
21070 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
21080 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
21090 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
210a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
210b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
210c0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
210d0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
210e0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
210f0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
21100 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
21110 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
21120 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
21130 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
21140 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
21150 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
21160 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
21170 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
21180 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
21190 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
211a0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
211b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
211c0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
211d0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
211e0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
211f0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21200 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21210 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21220 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
21230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
21240 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
21250 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21260 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
21270 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21280 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21290 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
212a0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
212b0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
212c0 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
212d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
212e0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
212f0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
21300 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
21310 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
21320 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
21330 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
21340 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
21350 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
21360 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
21370 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
21380 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
21390 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
213a0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
213b0 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
213c0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
213d0 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
213e0 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
213f0 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
21400 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
21410 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
21420 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
21430 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
21440 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
21450 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
21460 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
21470 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
21480 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
21490 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
214a0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
214b0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
214c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
214d0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
214e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
214f0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
21500 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21510 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
21520 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
21530 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21540 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21550 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21560 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21570 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
21580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21590 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
215a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
215b0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
215c0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
215d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
215e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
215f0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
21600 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21610 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
21620 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
21630 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
21640 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
21650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21660 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
21670 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
21680 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
21690 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
216a0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
216b0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
216c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
216d0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
216e0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
216f0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
21700 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
21710 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
21720 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
21730 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
21740 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
21750 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
21760 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
21770 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
21780 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
21790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
217a0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
217b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
217c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
217d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
217e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
217f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21810 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
21820 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
21830 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
21840 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
21850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21860 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
21870 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
21880 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
21890 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
218a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
218b0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
218c0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
218d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
218e0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
218f0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
21900 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21910 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
21920 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
21930 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
21940 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
21950 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
21960 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21970 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21980 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
21990 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
219a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
219b0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
219c0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
219d0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
219e0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
219f0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
21a00 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
21a10 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
21a20 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
21a30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
21a40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21a50 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
21a60 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
21a70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21a80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21a90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21aa0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
21ab0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
21ac0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
21ad0 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
21ae0 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
21af0 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
21b00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
21b10 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
21b20 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
21b30 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74   && pCur->atLast
21b40 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
21b50 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
21b60 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
21b70 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
21b80 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
21b90 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
21ba0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
21bb0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
21bc0 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
21bd0 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
21be0 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
21bf0 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
21c00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21c10 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
21c20 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
21c30 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
21c40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
21c50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21c60 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
21c70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
21c80 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
21c90 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21ca0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
21cb0 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
21cc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21cd0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
21ce0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
21cf0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
21d10 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
21d20 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
21d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21d40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21d50 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
21d60 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
21d70 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
21d80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21d90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21da0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21db0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
21dc0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
21dd0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
21de0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c  .      pCur->atL
21df0 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  ast = rc==SQLITE
21e00 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  _OK ?1:0;.    }.
21e10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21e20 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
21e30 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
21e40 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
21e50 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
21e60 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
21e70 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
21e80 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
21e90 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
21ea0 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
21eb0 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
21ec0 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
21ed0 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
21ee0 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
21ef0 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
21f00 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
21f10 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
21f20 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
21f30 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
21f40 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
21f50 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
21f60 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
21f70 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
21f80 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
21f90 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
21fa0 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
21fb0 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
21fc0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
21fd0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
21fe0 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
21ff0 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
22000 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
22010 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
22020 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
22030 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
22040 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
22050 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
22060 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
22070 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
22080 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
22090 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
220a0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
220b0 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
220c0 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
220d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
220e0 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
220f0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
22100 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
22110 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
22120 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
22130 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
22140 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
22150 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
22160 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
22170 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
22180 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
22190 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
221a0 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
221b0 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
221c0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
221d0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
221e0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22200 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
22210 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
22220 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
22230 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
22240 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
22250 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
22260 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
22270 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
22280 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
22290 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
222a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
222b0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
222c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
222d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
222e0 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
222f0 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
22300 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
22310 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
22320 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
22330 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
22340 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
22350 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
22360 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
22370 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
22380 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
22390 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
223a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
223c0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
223d0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
223e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
223f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22400 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22410 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22420 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
22430 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
22440 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
22450 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
22460 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
22470 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
22480 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
22490 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
224a0 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
224b0 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
224c0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
224d0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
224e0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
224f0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
22500 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
22510 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22520 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
22530 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22540 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
22550 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
22560 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
22570 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
22580 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
22590 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
225a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
225b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
225c0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
225d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
225e0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
225f0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
22600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22610 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
22620 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
22630 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
22640 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22650 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
22660 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22670 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
22680 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22690 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
226a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
226b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
226c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
226d0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72  >nCell>0 || pCur
226e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
226f0 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  _INVALID );.  if
22700 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22710 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
22720 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
22730 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
22740 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22750 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
22760 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
22770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
22780 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22790 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
227a0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
227b0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
227c0 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
227d0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
227e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
227f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
22800 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
22810 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
22820 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
22830 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
22840 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
22850 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
22860 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
22870 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
22880 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
22890 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
228a0 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
228b0 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
228c0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
228d0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
228e0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
228f0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
22900 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
22910 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
22920 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
22930 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
22940 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
22950 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
22960 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
22970 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
22980 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
22990 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
229a0 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
229b0 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
229c0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
229d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
229e0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
229f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22a00 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
22a10 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
22a20 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
22a30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
22a40 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
22a50 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
22a60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22a70 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a  ge] = (u16)upr;.
22a80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22a90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22aa0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22ab0 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a  )((upr+lwr)/2);.
22ac0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b      }.    for(;;
22ad0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
22ae0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
22af0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
22b00 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
22b10 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
22b20 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  /.      u8 *pCel
22b30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
22b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22b50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
22b60 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
22b70 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  */..      pCur->
22b80 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22b90 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
22ba0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
22bb0 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
22bc0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
22bd0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
22be0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  y ){.        i64
22bf0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
22c00 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
22c10 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
22c20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
22c30 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
22c40 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
22c50 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
22c60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
22c70 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
22c80 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
22c90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
22ca0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
22cb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
22cc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22cd0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
22ce0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
22cf0 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
22d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22d10 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
22d20 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
22d30 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
22d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d50 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22d60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
22d70 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
22d80 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
22d90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
22da0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
22db0 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
22dc0 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73  e is 32768 bytes
22dd0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
22de0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
22df0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
22e00 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
22e10 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
22e20 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
22e30 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20    ** page is at 
22e40 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c  most 8198 bytes,
22e50 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74   which may be st
22e60 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
22e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
22e80 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
22e90 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
22ea0 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
22eb0 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
22ec0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
22ed0 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
22ee0 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
22ef0 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
22f00 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
22f10 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
22f20 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
22f30 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
22f40 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
22f50 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
22f60 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
22f70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22f80 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43    int nCell = pC
22f90 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
22fa0 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78  if( !(nCell & 0x
22fb0 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50  80) && nCell<=pP
22fc0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
22fd0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
22fe0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
22ff0 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
23000 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
23010 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
23020 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
23030 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
23040 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
23050 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
23060 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
23070 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
23080 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
23090 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
230a0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
230b0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
230c0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
230d0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
230e0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
230f0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
23100 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
23110 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
23120 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
23130 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
23140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23150 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
23160 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
23170 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
23180 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
23190 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
231a0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
231b0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
231c0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
231d0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
231e0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
231f0 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
23200 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
23210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23220 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
23230 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
23240 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
23250 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
23260 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
23270 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
23280 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
23290 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
232a0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
232b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
232c0 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
232d0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
232e0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
232f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
23300 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
23310 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
23320 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
23330 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
23340 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
23350 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
23360 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
23370 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
23380 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
23390 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
233a0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
233b0 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
233c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
233d0 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
233e0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
233f0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
23400 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
23410 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
23420 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
23430 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
23440 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23450 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
23460 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
23470 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
23480 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
23490 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
234a0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
234b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
234c0 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
234d0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
234e0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
234f0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
23500 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
23510 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23520 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
23530 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23540 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
23550 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
23560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
23570 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
23580 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
23590 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
235a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
235b0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
235c0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c           upr = l
235d0 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  wr - 1;.        
235e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
235f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23600 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23610 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23620 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
23630 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
23640 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
23650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23660 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
23670 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
23680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23690 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
236a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
236b0 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20   lwr>upr ){.    
236c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
236d0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61   }.      pCur->a
236e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
236f0 5d 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75  ] = (u16)((lwr+u
23700 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  pr)/2);.    }.  
23710 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
23720 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65  pr+1 );.    asse
23730 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
23740 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
23750 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
23760 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20    chldPg = 0;.  
23770 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
23780 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
23790 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
237a0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
237b0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
237c0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
237d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
237e0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
237f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
23800 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
23810 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29   if( chldPg==0 )
23820 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23830 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23840 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
23850 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23860 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
23870 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
23880 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23890 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
238a0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
238b0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
238c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
238d0 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
238e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
238f0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
23900 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
23910 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
23920 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
23930 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
23940 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
23950 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  ish;.  }.moveto_
23960 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e  finish:.  return
23970 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
23980 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
23990 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
239a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
239b0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
239c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
239d0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
239e0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
239f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
23a00 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
23a10 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
23a20 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
23a30 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
23a40 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
23a50 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
23a60 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
23a70 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
23a80 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
23a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23aa0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
23ab0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
23ac0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
23ad0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
23ae0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
23af0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
23b00 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
23b10 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
23b20 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
23b30 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
23b40 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
23b50 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
23b60 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
23b70 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
23b80 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
23b90 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
23ba0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
23bb0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
23bc0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
23bd0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
23be0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
23bf0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
23c00 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
23c10 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
23c20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
23c30 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
23c40 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
23c50 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
23c60 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
23c70 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
23c80 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
23c90 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
23ca0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23cb0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
23cc0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
23cd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23ce0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
23cf0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23d00 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
23d10 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
23d20 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
23d30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23d40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
23d50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23d60 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
23d70 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
23d80 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
23d90 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
23da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23db0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
23dc0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
23dd0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
23de0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
23df0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
23e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23e10 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
23e20 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
23e30 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
23e40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
23e50 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
23e60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23e70 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
23e80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
23e90 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70    assert( idx<=p
23ea0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
23eb0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23ec0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
23ed0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
23ee0 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
23ef0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
23f00 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
23f10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
23f20 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
23f30 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
23f40 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
23f50 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
23f60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
23f70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
23f80 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
23f90 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
23fa0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
23fb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23fc0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
23fd0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
23fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
23ff0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
24000 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
24010 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
24020 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24030 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
24040 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
24050 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
24060 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24070 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24080 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
24090 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
240a0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
240b0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
240c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
240d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
240e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
240f0 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
24100 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
24110 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
24120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24130 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24140 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
24150 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
24160 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
24170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24180 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
24190 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
241a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
241b0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
241c0 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
241d0 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
241e0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
241f0 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
24200 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
24210 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
24220 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
24230 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
24240 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
24250 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
24260 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
24270 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
24280 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
24290 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
242a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
242b0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
242c0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
242d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
242e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
242f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24300 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24310 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
24320 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
24330 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
24340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
24360 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
24370 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
24380 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
24390 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
243a0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
243b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
243c0 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
243d0 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
243e0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
243f0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
24400 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
24410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
24420 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
24430 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
24440 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24450 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
24460 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
24470 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
24480 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24490 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
244a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
244b0 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
244c0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
244d0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
244e0 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
244f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
24500 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24510 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
24520 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
24530 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
24540 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
24550 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24560 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
24570 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
24580 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
24590 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
245a0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
245b0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
245c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
245d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
245e0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
245f0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
24600 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
24610 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
24620 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
24630 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
24640 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24650 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
24660 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24670 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
24680 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
24690 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
246a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
246b0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
246c0 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
246d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
246e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
246f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
24700 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
24710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
24720 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
24730 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
24740 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
24750 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
24760 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
24770 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
24780 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
24790 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
247a0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
247b0 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
247c0 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
247d0 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
247e0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
247f0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
24800 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
24810 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
24820 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
24830 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
24840 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
24850 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
24860 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24870 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
24880 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
24890 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
248a0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
248b0 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
248c0 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
248d0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
248e0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
248f0 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
24900 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
24910 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
24920 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
24930 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
24940 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
24950 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
24960 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
24970 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
24980 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
24990 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
249a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
249b0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
249c0 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
249d0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
249e0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
249f0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
24a00 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
24a10 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
24a20 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
24a30 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
24a40 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
24a50 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
24a60 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
24a70 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
24a80 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
24a90 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
24aa0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
24ab0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
24ac0 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
24ad0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
24ae0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
24af0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
24b00 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
24b10 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
24b20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
24b30 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
24b40 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
24b50 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
24b60 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
24b70 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
24b80 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
24b90 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
24ba0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
24bb0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
24bc0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
24bd0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
24be0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
24bf0 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
24c00 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
24c10 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
24c20 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
24c30 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
24c40 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
24c50 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
24c60 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
24c70 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
24c80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
24c90 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
24ca0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24cb0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
24cc0 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
24cd0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
24ce0 78 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  xPage = pagerPag
24cf0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
24d00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
24d10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
24d20 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
24d30 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
24d40 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
24d50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24d60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24d70 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
24d80 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
24d90 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
24da0 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
24db0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
24dc0 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
24dd0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
24de0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
24df0 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
24e00 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
24e10 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
24e20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
24e30 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
24e40 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
24e50 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
24e60 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
24e70 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
24e80 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
24e90 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
24ea0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
24eb0 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
24ec0 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
24ed0 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
24ee0 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
24ef0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
24f00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24f10 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61  CUUM.    if( exa
24f20 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78  ct && nearby<=mx
24f30 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38  Page ){.      u8
24f40 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73   eType;.      as
24f50 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
24f60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24f70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
24f80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  );.      rc = pt
24f90 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
24fa0 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
24fb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
24fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
24fd0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
24fe0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
24ff0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
25000 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
25010 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65       *pPgno = ne
25020 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  arby;.    }.#end
25030 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
25040 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
25050 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
25060 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
25070 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
25080 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
25090 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
250a0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
250b0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
250c0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
250d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
250e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
250f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
25100 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
25110 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
25120 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
25130 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
25140 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
25150 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
25160 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
25170 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
25180 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
25190 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
251a0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
251b0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
251c0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
251d0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
251e0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
251f0 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a  s located..    *
25200 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
25210 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
25220 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
25230 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
25240 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
25250 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
25260 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
25270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25280 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
25290 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
252a0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
252b0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
252c0 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
252d0 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
252e0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
252f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25300 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25310 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
25320 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
25330 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
25340 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
25350 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
25360 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25370 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
25380 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25390 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
253a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b        }..      k
253b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
253c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
253d0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
253e0 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
253f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
25400 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
25410 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
25420 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
25430 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
25440 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
25450 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
25460 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
25470 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
25480 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
25490 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
254a0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
254b0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
254c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
254d0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
254e0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
254f0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25500 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25510 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25530 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
25540 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
25550 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
25560 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
25570 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
25580 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
25590 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
255a0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
255b0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
255c0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
255d0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
255e0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
255f0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
25600 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
25610 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
25620 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
25630 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
25640 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
25650 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
25660 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
25670 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25680 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
25690 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
256a0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
256b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
256c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
256d0 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
256e0 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
256f0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
25700 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
25710 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
25720 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
25730 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
25740 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
25750 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
25760 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
25770 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
25780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
25790 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
257a0 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
257b0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
257c0 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
257d0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
257e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
257f0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
25800 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
25810 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
25820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25830 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25850 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
25860 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
25870 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
25880 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
25890 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
258a0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
258b0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
258c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
258d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
258e0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
258f0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
25900 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
25910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25930 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
25940 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
25950 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
25960 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
25970 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
25980 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
25990 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
259a0 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
259b0 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
259c0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
259d0 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
259e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
259f0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
25a00 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
25a10 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
25a20 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
25a30 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
25a40 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
25a50 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
25a60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25a70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25a80 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
25a90 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25aa0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
25ab0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
25ac0 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
25ad0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
25ae0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
25af0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65  GetPage(pBt, iNe
25b00 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
25b10 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
25b20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
25b40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25b50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
25b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25b70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25b80 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
25b90 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
25ba0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
25bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25bc0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
25bd0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
25be0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25bf0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25c00 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
25c10 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
25c20 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
25c30 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
25c40 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
25c50 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
25c60 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
25c70 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
25c80 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
25c90 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
25ca0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
25cb0 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
25cc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
25cd0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
25ce0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
25cf0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
25d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
25d10 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
25d20 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
25d30 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
25d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
25d50 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
25d60 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
25d70 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
25d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25da0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
25db0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25dd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
25de0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25df0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25e10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
25e20 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
25e30 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
25e40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25e60 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
25e70 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
25e80 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
25e90 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
25ea0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
25eb0 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
25ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
25ed0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
25ee0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
25ef0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
25f00 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
25f10 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
25f20 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
25f30 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25f40 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
25f50 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
25f60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25f70 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
25f80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
25f90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
25fa0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25fb0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
25fd0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
25fe0 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
25ff0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
26000 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
26010 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
26020 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34       dist = get4
26030 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
26040 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
26050 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29      if( dist<0 )
26060 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20   dist = -dist;. 
26070 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
26080 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
26090 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
260a0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
260b0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
260c0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  by;.            
260d0 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20  if( d2<0 ) d2 = 
260e0 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -d2;.           
260f0 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
26110 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
26120 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
26130 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
26140 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
26150 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26160 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
26170 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
26180 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
26190 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
261a0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
261b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
261c0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
261d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
261e0 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
261f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26200 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26210 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
26220 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
26230 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
26240 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
26250 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
26260 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
26270 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
26280 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
26290 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
262a0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
262b0 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
262c0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
262d0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
262e0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
262f0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
26310 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
26320 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
26330 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
26340 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
26350 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
26360 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
26370 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
26380 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
26390 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
263a0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
263b0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
263c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
263d0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
263e0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
263f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
26400 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
26410 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44  eable(pTrunk->pD
26420 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
26430 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
26440 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
26450 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
26460 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26470 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
26480 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
26490 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
264a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
264b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
264c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
264d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
264e0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
264f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26520 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26530 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
26540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26550 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
26560 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
26570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26580 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
26590 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
265a0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
265b0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
265c0 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a  ( searchList );.
265d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
265e0 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67  There are no pag
265f0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
26600 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20  st, so create a 
26610 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a  new page at the.
26620 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68      ** end of th
26630 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e  e file */.    in
26640 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50  t nPage = pagerP
26650 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
26660 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67     *pPgno = nPag
26670 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20  e + 1;..    if( 
26680 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
26690 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
266a0 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  {.      (*pPgno)
266b0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ++;.    }..#ifnd
266c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
266d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
266e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
266f0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
26700 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
26710 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
26720 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
26730 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
26740 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
26750 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
26760 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
26770 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
26780 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
26790 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
267a0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
267b0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
267c0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
267d0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
267e0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
267f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
26800 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
26810 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
26820 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
26830 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
26840 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
26850 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
26860 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
26870 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
26880 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
26890 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
268a0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
268b0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
268c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
268d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
268e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
268f0 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
26900 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
26910 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
26920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26930 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
26940 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
26950 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50  +;.      if( *pP
26960 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
26970 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28  E_PAGE(pBt) ){ (
26980 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20  *pPgno)++; }.   
26990 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
269a0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
269b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
269c0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
269d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
269e0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
269f0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
26a00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
26a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26a20 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
26a30 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
26a40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26a60 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
26a70 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
26a80 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
26a90 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
26aa0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
26ab0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
26ac0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
26ad0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
26ae0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
26af0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
26b00 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
26b10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
26b20 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
26b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26b40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26b50 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
26b60 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
26b70 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
26b80 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
26b90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
26ba0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26bb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
26bc0 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
26bd0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
26be0 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
26bf0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
26c00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
26c10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
26c20 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
26c30 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
26c40 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
26c50 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
26c60 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
26c70 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
26c80 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
26c90 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
26ca0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
26cb0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26cc0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
26cd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26ce0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
26cf0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
26d00 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
26d10 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
26d20 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
26d30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
26d40 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
26d50 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
26d60 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
26d70 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
26d80 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
26d90 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
26da0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
26db0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
26dc0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
26dd0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
26de0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
26df0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
26e00 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
26e10 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
26e20 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
26e30 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
26e40 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
26e50 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
26e60 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
26e70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26e80 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
26e90 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
26ea0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
26eb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
26ec0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
26ed0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
26ee0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
26ef0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
26f00 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
26f10 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
26f20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
26f30 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
26f40 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26f60 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
26f70 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
26f80 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fa0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26fb0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
26fc0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fe0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
26ff0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
27000 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
27010 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
27020 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
27030 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
27040 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
27050 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
27060 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
27070 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
27080 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
27090 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
270a0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
270b0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
270c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
270d0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
270e0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
270f0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
27100 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
27110 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
27120 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
27130 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
27140 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
27150 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
27160 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
27170 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
27180 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
27190 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
271a0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
271b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
271c0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
271d0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
271e0 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
271f0 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
27200 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
27210 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
27220 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
27230 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
27240 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
27250 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
27260 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
27270 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
27280 20 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50   (rc = btreeGetP
27290 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
272a0 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20  &pPage, 0))).   
272b0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72  ||            (r
272c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
272d0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
272e0 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20  Page)).  ){.    
272f0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
27300 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  t;.  }.  memset(
27310 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
27320 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
27330 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
27340 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
27350 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
27360 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
27370 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
27380 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
27390 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
273a0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
273b0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
273c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
273d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
273e0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
273f0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
27400 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
27410 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27420 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
27430 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
27440 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
27450 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
27460 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
27470 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
27480 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
27490 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
274a0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
274b0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
274c0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
274d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
274e0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
274f0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
27500 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
27510 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
27520 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
27530 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
27540 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
27550 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
27560 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
27570 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
27580 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
27590 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
275a0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
275b0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
275c0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
275d0 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
275e0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
275f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27600 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
27610 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
27620 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
27630 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
27640 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
27650 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
27660 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
27670 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
27680 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
27690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
276a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
276b0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
276c0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
276d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
276e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
276f0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
27700 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
27710 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
27720 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
27730 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
27740 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27760 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c  nLeaf<pBt->usabl
27770 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
27780 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
27790 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
277a0 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
277b0 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
277c0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
277d0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
277e0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
277f0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
27800 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
27810 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
27820 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
27830 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
27840 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
27850 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
27860 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
27870 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
27880 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
27890 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
278a0 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
278b0 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
278c0 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
278d0 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
278e0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
278f0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
27900 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
27910 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
27920 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
27930 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
27940 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
27950 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
27960 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
27970 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
27980 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
27990 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
279a0 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
279b0 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
279c0 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
279d0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
279e0 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
279f0 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
27a00 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
27a10 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
27a20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
27a30 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
27a40 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
27a50 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
27a60 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
27a70 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
27a80 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
27a90 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
27aa0 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
27ab0 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
27ac0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
27ad0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27af0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
27b00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27b20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
27b30 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
27b40 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
27b50 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
27b60 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
27b70 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
27b80 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  Page);.#ifndef S
27b90 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
27ba0 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  ETE.        if( 
27bb0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
27bc0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
27bd0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
27be0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27bf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
27c00 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
27c10 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
27c20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
27c30 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
27c40 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
27c50 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
27c60 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
27c70 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
27c80 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
27c90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
27ca0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
27cb0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
27cc0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
27cd0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
27ce0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
27cf0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
27d00 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
27d10 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
27d20 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
27d30 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
27d40 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
27d50 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
27d60 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
27d70 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
27d80 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
27d90 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
27da0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
27db0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
27dc0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
27dd0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
27de0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
27df0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
27e00 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
27e10 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
27e20 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
27e30 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27e40 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
27e50 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
27e60 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27e70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
27e80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
27e90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
27ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
27ec0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27ed0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
27ee0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
27ef0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
27f00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
27f10 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
27f20 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27f30 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
27f40 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
27f50 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
27f60 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
27f70 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
27f80 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
27f90 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
27fa0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
27fb0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
27fc0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
27fd0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
27fe0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
27ff0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28000 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
28010 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
28020 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
28030 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
28040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
28050 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
28060 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
28070 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
28080 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
28090 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
280a0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
280b0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
280c0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
280d0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
280e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
280f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
28100 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
28110 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
28120 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
28130 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
28140 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
28150 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
28160 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
28170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28180 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
28190 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
281a0 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
281b0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
281c0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
281d0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
281e0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
281f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
28200 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
28210 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
28220 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
28230 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
28240 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
28250 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
28260 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
28270 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
28280 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
28290 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
282a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
282b0 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
282c0 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
282d0 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
282e0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
282f0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
28300 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
28310 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
28320 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
28330 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
28340 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
28350 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
28360 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
28370 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
28380 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
28390 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
283a0 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
283b0 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
283c0 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
283d0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
283e0 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
283f0 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
28400 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
28410 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
28420 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
28430 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
28440 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
28450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28460 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
28470 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
28480 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
28490 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
284a0 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
284b0 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
284c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
284d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
284e0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
284f0 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
28500 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  lPgno);.    if( 
28510 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
28520 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
28530 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
28540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28550 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
28560 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
28570 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
28580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28590 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
285a0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
285b0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
285c0 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
285d0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
285e0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
285f0 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
28600 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
28610 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
28620 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
28630 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
28640 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
28650 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
28660 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
28670 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
28680 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
28690 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
286a0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
286b0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
286c0 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
286d0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
286e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
286f0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
28700 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
28710 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
28720 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
28730 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
28740 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
28750 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
28760 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
28770 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
28780 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
28790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
287a0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
287b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
287c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
287d0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
287e0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
287f0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
28800 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
28810 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
28820 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
28830 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
28840 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
28850 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
28860 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
28870 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
28880 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
28890 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
288c0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
288d0 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
288e0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28900 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
28910 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
28920 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
28930 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
28940 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
28950 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
28960 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
28970 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
28980 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
28990 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
289a0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
289b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
289c0 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
289d0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
289e0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
289f0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
28a00 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
28a10 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
28a20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
28a30 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
28a40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
28a50 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
28a60 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
28a70 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
28a80 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
28a90 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
28aa0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
28ab0 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
28ac0 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
28ad0 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
28ae0 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
28af0 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
28b00 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
28b10 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
28b20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
28b30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
28b40 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
28b50 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
28b60 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
28b70 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
28b80 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
28b90 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
28ba0 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
28bb0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
28bc0 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
28bd0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
28be0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
28bf0 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
28c00 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
28c10 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
28c20 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
28c30 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
28c40 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
28c50 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50  &nKey);.  btreeP
28c60 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
28c70 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
28c80 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
28c90 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
28ca0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
28cb0 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
28cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
28cd0 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44  .nData==(u32)(nD
28ce0 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20  ata+nZero) );.  
28cf0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
28d00 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e  e payload */.  n
28d10 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
28d20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
28d30 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
28d40 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
28d50 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
28d60 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
28d70 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
28d80 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e   if( NEVER(nKey>
28d90 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
28da0 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ey==0) ){.      
28db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28dc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
28dd0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
28de0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
28df0 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
28e00 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
28e10 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
28e20 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
28e30 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
28e40 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
28e50 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
28e60 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
28e70 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
28e80 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
28e90 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
28ea0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
28eb0 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
28ec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28ed0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
28ee0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
28ef0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
28f00 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
28f10 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
28f20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
28f30 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
28f40 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
28f50 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
28f60 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
28f70 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
28f80 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
28f90 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
28fa0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
28fb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
28fc0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
28fd0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
28fe0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
28ff0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
29000 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
29010 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
29020 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
29030 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
29040 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
29050 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
29060 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
29070 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
29080 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
29090 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
290a0 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
290b0 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
290c0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
290d0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
290e0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
290f0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
29100 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
29110 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
29120 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
29130 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
29140 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
29150 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
29160 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
29170 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
29180 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
29190 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
291a0 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
291b0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
291c0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
291d0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
291e0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
291f0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
29200 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
29210 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
29220 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
29230 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
29240 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
29250 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
29260 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
29270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29280 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
29290 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
292a0 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
292b0 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
292c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
292d0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
292e0 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
292f0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
29300 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
29310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
29320 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
29330 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
29340 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29350 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
29360 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
29370 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
29380 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
29390 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
293a0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
293b0 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
293c0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
293d0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
293e0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
293f0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
29400 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
29410 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
29420 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
29430 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
29440 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29450 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
29460 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
29470 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
29480 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
29490 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
294a0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
294b0 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
294c0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
294d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
294e0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
294f0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
29500 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
29510 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
29520 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
29530 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29540 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
29550 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
29560 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
29570 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
29580 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
29590 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
295a0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
295b0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
295c0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
295d0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
295e0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
295f0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
29600 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
29610 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
29620 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
29630 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
29640 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
29650 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
29660 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
29670 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
29680 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
29690 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
296a0 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
296b0 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
296c0 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
296d0 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
296e0 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
296f0 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
29700 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
29710 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
29720 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29730 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
29740 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
29750 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
29760 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
29770 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
29780 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
29790 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
297a0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
297b0 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
297c0 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
297d0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
297e0 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
297f0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
29800 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
29810 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29820 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29830 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
29840 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
29850 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
29860 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
29870 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
29880 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
29890 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
298a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
298b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
298c0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
298d0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
298e0 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
298f0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
29900 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
29910 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
29920 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
29930 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
29940 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
29950 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
29960 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
29970 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
29980 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
29990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
299a0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
299b0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
299c0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
299d0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
299e0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
299f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
29a00 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
29a10 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
29a20 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
29a30 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
29a40 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
29a50 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
29a60 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
29a70 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
29a80 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
29a90 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
29aa0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
29ab0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
29ac0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
29ad0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
29ae0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
29af0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
29b00 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
29b10 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
29b20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
29b30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29b40 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
29b50 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
29b60 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
29b70 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
29b80 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
29b90 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
29ba0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
29bb0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
29bc0 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
29bd0 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
29be0 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
29bf0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
29c00 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
29c10 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  de */.  int hdr;
29c20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
29c30 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64  ning of the head
29c40 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65  er.  0 most page
29c50 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a  s.  100 page 1 *
29c60 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
29c70 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
29c80 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
29c90 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
29ca0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
29cb0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
29cc0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
29cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29ce0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29cf0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
29d00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29d10 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
29d20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
29d30 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29d40 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
29d50 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
29d60 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
29d70 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
29d80 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
29d90 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
29da0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
29db0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
29dc0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
29dd0 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
29de0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
29df0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
29e00 3c 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  < get2byte(&data
29e10 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
29e20 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
29e30 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
29e40 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
29e50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29e60 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
29e70 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
29e80 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
29e90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
29ea0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
29eb0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
29ec0 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65  i=idx+1; i<pPage
29ed0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74  ->nCell; i++, pt
29ee0 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30  r+=2){.    ptr[0
29ef0 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20  ] = ptr[2];.    
29f00 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b  ptr[1] = ptr[3];
29f10 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
29f20 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74  ell--;.  put2byt
29f30 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
29f40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
29f50 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
29f60 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   2;.}../*.** Ins
29f70 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
29f80 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
29f90 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
29fa0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
29fb0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
29fc0 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
29fd0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
29fe0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
29ff0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
2a000 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
2a010 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
2a020 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
2a030 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
2a040 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
2a050 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
2a060 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
2a070 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
2a080 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
2a090 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
2a0a0 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20  ge->aOvfl[] and 
2a0b0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
2a0c0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2a0d0 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
2a0e0 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
2a0f0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
2a100 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
2a110 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
2a120 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
2a130 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
2a140 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
2a150 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
2a160 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
2a170 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
2a180 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2a190 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
2a1a0 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
2a1b0 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
2a1c0 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
2a1d0 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
2a1e0 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
2a1f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2a200 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
2a210 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2a220 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
2a230 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
2a240 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
2a250 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
2a260 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
2a270 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
2a280 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
2a290 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
2a2a0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
2a2b0 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
2a2c0 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
2a2d0 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
2a2e0 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
2a2f0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
2a300 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
2a310 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
2a320 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
2a330 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
2a340 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
2a350 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
2a360 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
2a370 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
2a380 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
2a390 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
2a3a0 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
2a3b0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
2a3c0 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
2a3d0 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
2a3e0 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
2a3f0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
2a400 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
2a410 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
2a420 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
2a430 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
2a440 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
2a450 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
2a460 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
2a470 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
2a480 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
2a490 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
2a4a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2a4b0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
2a4c0 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
2a4d0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
2a4e0 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
2a4f0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2a500 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
2a510 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2a520 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
2a530 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
2a540 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
2a550 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
2a560 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2a570 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
2a580 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2a590 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2a5a0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
2a5b0 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
2a5c0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
2a5d0 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tr;          /* 
2a5e0 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20  Used for moving 
2a5f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75  information arou
2a600 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nd in data[] */.
2a610 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
2a620 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
2a630 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2a640 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2a650 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
2a660 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
2a670 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
2a680 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2a690 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
2a6a0 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f  age->pBt) && MX_
2a6b0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2a6c0 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65  <=5460 );.  asse
2a6d0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2a6e0 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
2a6f0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b  pPage->aOvfl) );
2a700 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2a710 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2a720 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  , pCell) );.  as
2a730 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a740 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2a750 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a760 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2a770 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
2a780 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
2a790 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
2a7a0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2a7b0 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
2a7c0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2a7d0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
2a7e0 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
2a7f0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2a800 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
2a810 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
2a820 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
2a830 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
2a840 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
2a850 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
2a860 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
2a870 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
2a880 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
2a890 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
2a8a0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2a8b0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
2a8c0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
2a8d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2a8e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a8f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a900 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2a910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a920 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2a930 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2a940 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2a950 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2a960 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2a970 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
2a980 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2a990 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
2a9a0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2a9b0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
2a9c0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2a9d0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
2a9e0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
2a9f0 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
2aa00 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
2aa10 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
2aa20 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
2aa30 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
2aa40 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
2aa50 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
2aa60 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
2aa70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2aa80 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
2aa90 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
2aaa0 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
2aab0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
2aac0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
2aad0 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
2aae0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2aaf0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50  leSize );.    pP
2ab00 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
2ab10 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
2ab20 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
2ab30 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2ab40 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43  a[idx+nSkip], pC
2ab50 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2ab60 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43  kip);.    if( iC
2ab70 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
2ab80 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
2ab90 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
2aba0 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c  }.    for(j=end,
2abb0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
2abc0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
2abd0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
2abe0 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
2abf0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
2ac00 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
2ac10 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
2ac20 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
2ac30 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
2ac40 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
2ac50 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
2ac60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ac70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2ac80 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2ac90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2aca0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
2acb0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
2acc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2acd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2ace0 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
2acf0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
2ad00 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2ad10 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
2ad20 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
2ad30 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
2ad40 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
2ad50 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
2ad60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2ad70 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
2ad80 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
2ad90 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
2ada0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
2adb0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
2adc0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
2add0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
2ade0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
2adf0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
2ae00 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
2ae10 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2ae20 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
2ae30 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
2ae40 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
2ae50 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
2ae60 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
2ae70 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
2ae80 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
2ae90 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
2aea0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
2aeb0 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
2aec0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2aed0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
2aee0 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2aef0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2af00 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  unter */.  u8 *p
2af10 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20  Cellptr;     /* 
2af20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2af30 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
2af40 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
2af50 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2af60 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
2af70 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
2af80 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2af90 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2afa0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2afb0 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a  data for pPage *
2afc0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  /.  const int hd
2afd0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2afe0 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
2aff0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
2b000 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  der on pPage */.
2b010 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61    const int nUsa
2b020 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ble = pPage->pBt
2b030 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  ->usableSize; /*
2b040 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
2b050 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
2b060 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2b070 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
2b080 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b090 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b0a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2b0b0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
2b0c0 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  && nCell<=MX_CEL
2b0d0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
2b0e0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
2b0f0 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
2b100 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2b110 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2b120 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2b130 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2b140 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73  hat the page has
2b150 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65   just been zeroe
2b160 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20  d by zeroPage() 
2b170 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
2b180 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2b190 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
2b1a0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2b1b0 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
2b1c0 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61  pCellptr = &data
2b1d0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2b1e0 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
2b1f0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
2b200 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
2b210 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
2b220 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d  {.    pCellptr -
2b230 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  = 2;.    cellbod
2b240 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y -= aSize[i];. 
2b250 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
2b260 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  lptr, cellbody);
2b270 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2b280 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
2b290 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
2b2a0 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
2b2b0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
2b2c0 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
2b2d0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
2b2e0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2b2f0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e  age->nFree -= (n
2b300 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65  Cell*2 + nUsable
2b310 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20   - cellbody);.  
2b320 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28  pPage->nCell = (
2b330 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  u16)nCell;.}../*
2b340 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2b350 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
2b360 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
2b370 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
2b380 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
2b390 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
2b3a0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
2b3b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
2b3c0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2b3d0 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
2b3e0 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
2b3f0 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2b400 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2b410 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
2b420 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2b430 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
2b440 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
2b450 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
2b460 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
2b470 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2b480 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
2b490 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
2b4a0 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
2b4b0 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
2b4c0 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
2b4d0 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
2b4e0 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
2b4f0 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
2b500 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
2b510 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
2b520 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
2b530 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
2b540 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
2b550 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
2b560 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
2b570 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
2b580 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
2b590 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
2b5a0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b5c0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2b5d0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2b5e0 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
2b5f0 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
2b600 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
2b610 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
2b620 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
2b630 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2b640 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2b650 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
2b660 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
2b670 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
2b680 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
2b690 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
2b6a0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
2b6b0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
2b6c0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
2b6d0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
2b6e0 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
2b6f0 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
2b700 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
2b710 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
2b720 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
2b730 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
2b740 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20  ad of trying to 
2b750 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
2b760 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
2b770 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
2b780 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2b790 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2b7a0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
2b7b0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
2b7c0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
2b7d0 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
2b7e0 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
2b7f0 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
2b800 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
2b810 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
2b820 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
2b830 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
2b840 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
2b850 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
2b860 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
2b870 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
2b880 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
2b890 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
2b8a0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
2b8b0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
2b8c0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
2b8d0 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
2b8e0 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
2b8f0 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
2b900 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
2b910 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
2b920 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
2b930 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
2b940 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
2b950 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
2b960 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
2b970 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
2b980 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
2b990 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
2b9a0 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
2b9b0 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
2b9c0 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
2b9d0 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
2b9e0 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
2b9f0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2ba00 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
2ba10 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2ba20 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
2ba30 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
2ba40 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
2ba50 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
2ba60 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
2ba70 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
2ba80 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
2ba90 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2baa0 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
2bab0 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
2bac0 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
2bad0 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
2bae0 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
2baf0 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
2bb00 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
2bb10 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
2bb20 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2bb30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2bb40 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
2bb50 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
2bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2bb80 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2bb90 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
2bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2bbc0 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
2bbd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bbe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2bbf0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2bc00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2bc10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2bc20 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2bc30 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2bc40 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2bc50 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  flow==1 );..  if
2bc60 28 20 4e 45 56 45 52 28 70 50 61 67 65 2d 3e 6e  ( NEVER(pPage->n
2bc70 43 65 6c 6c 3c 3d 30 29 20 29 20 72 65 74 75 72  Cell<=0) ) retur
2bc80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2bc90 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
2bca0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2bcb0 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
2bcc0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
2bcd0 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
2bce0 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
2bcf0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2bd00 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
2bd10 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2bd20 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
2bd30 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
2bd40 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
2bd50 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
2bd60 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
2bd70 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
2bd80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2bd90 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
2bda0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
2bdb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bdc0 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
2bdd0 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
2bde0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
2bdf0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
2be00 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
2be10 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
2be20 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2be30 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
2be40 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2be50 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2be60 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
2be70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
2be80 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
2be90 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
2bea0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2beb0 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
2bec0 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
2bed0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2bee0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
2bef0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2bf00 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
2bf10 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
2bf20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2bf30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2bf40 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2bf50 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
2bf60 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
2bf70 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
2bf80 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
2bf90 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
2bfa0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
2bfb0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
2bfc0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
2bfd0 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
2bfe0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
2bff0 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
2c000 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
2c010 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
2c020 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
2c030 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
2c040 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
2c050 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
2c060 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
2c070 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
2c080 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
2c090 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
2c0a0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
2c0b0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2c0c0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
2c0d0 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
2c0e0 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
2c0f0 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
2c100 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
2c110 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2c120 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2c130 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2c140 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
2c150 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
2c160 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2c170 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
2c180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
2c190 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
2c1a0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
2c1b0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2c1c0 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
2c1d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c1e0 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
2c1f0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
2c200 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
2c210 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
2c220 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
2c230 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
2c240 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2c250 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
2c260 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
2c270 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
2c280 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
2c290 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
2c2a0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
2c2b0 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
2c2c0 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
2c2d0 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
2c2e0 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
2c2f0 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
2c300 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
2c310 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
2c320 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
2c330 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
2c340 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
2c350 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
2c360 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
2c370 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
2c380 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2c390 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
2c3a0 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
2c3b0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
2c3c0 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
2c3d0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2c3e0 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
2c3f0 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
2c400 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
2c410 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
2c420 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
2c430 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
2c440 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
2c450 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
2c460 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
2c470 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
2c480 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
2c490 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
2c4a0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
2c4b0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
2c4c0 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
2c4d0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
2c4e0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
2c4f0 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2c500 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2c510 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
2c520 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
2c530 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
2c540 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
2c550 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
2c560 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
2c570 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
2c580 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
2c590 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
2c5a0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2c5b0 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
2c5c0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
2c5d0 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
2c5e0 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
2c5f0 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
2c600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c610 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
2c620 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
2c630 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
2c640 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
2c650 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
2c660 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
2c670 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2c680 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2c690 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2c6a0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
2c6b0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
2c6c0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
2c6d0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2c6e0 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
2c6f0 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
2c700 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c710 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2c720 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2c730 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a  CE */..#if 0./*.
2c740 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c750 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2c760 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
2c770 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
2c780 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
2c790 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
2c7a0 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
2c7b0 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
2c7c0 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
2c7d0 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
2c7e0 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
2c7f0 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
2c800 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
2c810 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
2c820 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
2c830 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
2c840 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2c850 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2c860 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
2c870 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2c880 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
2c890 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
2c8a0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2c8b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2c8c0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2c8d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2c8e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
2c8f0 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
2c900 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
2c910 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
2c920 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
2c930 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
2c940 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2c950 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
2c960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
2c970 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
2c980 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
2c990 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
2c9a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
2c9b0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
2c9c0 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
2c9d0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
2c9e0 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2c9f0 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2ca00 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
2ca10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ca20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2ca30 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
2ca40 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2ca50 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
2ca60 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
2ca70 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2ca80 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2ca90 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2caa0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2cab0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2cac0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2cad0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
2cae0 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2caf0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2cb00 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2cb10 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
2cb20 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
2cb30 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2cb40 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2cb50 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2cb60 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
2cb70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2cb80 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
2cb90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2cba0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
2cbb0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
2cbc0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
2cbd0 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
2cbe0 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
2cbf0 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
2cc00 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
2cc10 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
2cc20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
2cc30 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
2cc40 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
2cc50 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
2cc60 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
2cc70 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
2cc80 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2cc90 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
2cca0 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
2ccb0 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
2ccc0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
2ccd0 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
2cce0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2ccf0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
2cd00 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
2cd10 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
2cd20 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2cd30 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
2cd40 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
2cd50 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
2cd60 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
2cd70 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
2cd80 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
2cd90 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c  .aOvfl[] array),
2cda0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f   they are not co
2cdb0 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a  pied to pTo. .**
2cdc0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
2cdd0 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69  ning, page pTo i
2cde0 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  s reinitialized 
2cdf0 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50  using btreeInitP
2ce00 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
2ce10 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
2ce20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2ce30 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
2ce40 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
2ce50 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
2ce60 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
2ce70 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
2ce80 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
2ce90 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
2cea0 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
2ceb0 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
2cec0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
2ced0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2cee0 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
2cef0 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
2cf00 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74  emPage *pTo, int
2cf10 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
2cf20 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
2cf30 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
2cf40 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
2cf50 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38  rom->pBt;.    u8
2cf60 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
2cf70 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
2cf80 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54     u8 * const aT
2cf90 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a  o = pTo->aData;.
2cfa0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46      int const iF
2cfb0 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e  romHdr = pFrom->
2cfc0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  hdrOffset;.    i
2cfd0 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
2cfe0 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
2cff0 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
2d000 20 20 54 45 53 54 4f 4e 4c 59 28 69 6e 74 20 72    TESTONLY(int r
2d010 63 3b 29 0a 20 20 20 20 69 6e 74 20 69 44 61 74  c;).    int iDat
2d020 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73  a;.  .  .    ass
2d030 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
2d040 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
2d050 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
2d060 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73  iToHdr );.    as
2d070 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2d080 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2d090 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ])<=pBt->usableS
2d0a0 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
2d0b0 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
2d0c0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
2d0d0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
2d0e0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
2d0f0 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2d100 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2d110 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
2d120 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2d130 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2d140 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2d150 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
2d160 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
2d170 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
2d180 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
2d190 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
2d1a0 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
2d1b0 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2d1c0 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2d1d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2d1e0 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2d1f0 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
2d200 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
2d210 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
2d220 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f  on of pTo "canno
2d230 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68 65 0a  t" fail, as the.
2d240 20 20 20 20 2a 2a 20 64 61 74 61 20 63 6f 70 69      ** data copi
2d250 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20 69 73  ed from pFrom is
2d260 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76 61 6c   known to be val
2d270 69 64 2e 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d  id.  */.    pTo-
2d280 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
2d290 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29   TESTONLY(rc = )
2d2a0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
2d2b0 54 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  To);.    assert(
2d2c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d2d0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
2d2e0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2d2f0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2d300 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2d310 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
2d320 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
2d330 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2d340 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2d350 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2d360 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
2d370 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2d380 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2d390 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
2d3a0 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
2d3b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
2d3c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d3d0 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
2d3e0 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
2d3f0 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
2d400 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
2d410 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
2d420 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
2d430 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
2d440 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
2d450 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
2d460 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
2d470 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
2d480 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
2d490 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2d4a0 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
2d4b0 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
2d4c0 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
2d4d0 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
2d4e0 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
2d4f0 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
2d500 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
2d510 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
2d520 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
2d530 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
2d540 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
2d550 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
2d560 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
2d570 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
2d580 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
2d590 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
2d5a0 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
2d5b0 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
2d5c0 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
2d5d0 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
2d5e0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2d5f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
2d600 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
2d610 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
2d620 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
2d630 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
2d640 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
2d650 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
2d660 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
2d670 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
2d680 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
2d690 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
2d6a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2d6b0 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
2d6c0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
2d6d0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
2d6e0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
2d6f0 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
2d700 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
2d710 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
2d720 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
2d730 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
2d740 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
2d750 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
2d760 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2d770 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
2d780 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
2d790 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
2d7a0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2d7b0 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
2d7c0 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
2d7d0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2d7e0 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
2d7f0 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
2d800 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
2d810 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2d820 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
2d830 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
2d840 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
2d850 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
2d860 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
2d870 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
2d880 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
2d890 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
2d8a0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
2d8b0 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
2d8c0 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
2d8d0 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
2d8e0 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
2d8f0 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
2d900 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
2d910 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
2d920 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
2d930 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
2d940 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
2d950 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
2d960 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
2d970 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
2d980 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
2d990 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
2d9a0 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
2d9b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
2d9c0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
2d9d0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
2d9e0 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
2d9f0 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
2da00 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
2da10 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
2da20 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
2da30 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
2da40 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
2da50 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
2da60 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
2da70 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
2da80 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
2da90 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
2daa0 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
2dab0 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
2dac0 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
2dad0 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
2dae0 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
2daf0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
2db00 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2db10 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
2db20 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
2db30 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
2db40 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
2db50 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
2db60 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
2db70 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
2db80 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
2db90 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
2dba0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
2dbb0 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
2dbc0 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
2dbd0 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
2dbe0 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
2dbf0 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
2dc00 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
2dc10 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
2dc20 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74  ITE_NOMEM..*/.st
2dc30 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2dc40 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
2dc50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2dc70 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
2dc80 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
2dc90 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
2dca0 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
2dcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2dcc0 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
2dcd0 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
2dce0 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
2dcf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dd00 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
2dd10 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
2dd20 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
2dd30 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20  .  int isRoot   
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
2dd60 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
2dd70 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  page */.){.  BtS
2dd80 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2dd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2dda0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
2ddb0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
2ddc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ddd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2dde0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2ddf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
2de00 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
2de10 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
2de20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
2de30 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
2de40 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
2de50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2de70 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
2de80 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2deb0 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
2dec0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2def0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  s */.  int nxDiv
2df00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2df10 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
2df20 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
2df30 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
2df40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2df50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
2df60 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2df70 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43  e */.  u16 leafC
2df80 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
2df90 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
2dfa0 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
2dfb0 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
2dfc0 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
2dfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2dfe0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2dff0 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
2e000 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
2e010 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
2e020 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2e030 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
2e040 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
2e050 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e070 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
2e080 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
2e090 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e0b0 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
2e0c0 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
2e0d0 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
2e0e0 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
2e0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2e100 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
2e110 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
2e120 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d  int iOvflSpace =
2e130 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
2e140 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2e150 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b  e of aOvflSpace[
2e160 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
2e170 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2e180 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
2e190 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
2e1a0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
2e1b0 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
2e1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
2e1d0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
2e1e0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d   siblings */.  M
2e1f0 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
2e200 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
2e210 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
2e220 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
2e230 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
2e240 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2e250 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2e260 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
2e270 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
2e280 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b  */.  u8 *pRight;
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e    /* Location in
2e2b0 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74   parent of right
2e2c0 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72  -sibling pointer
2e2d0 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
2e2e0 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20  NB-1];          
2e2f0 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
2e300 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
2e310 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
2e320 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
2e330 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
2e340 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
2e350 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
2e360 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
2e370 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
2e380 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
2e390 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
2e3a0 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
2e3b0 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
2e3c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e3d0 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
2e3e0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
2e3f0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
2e400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e410 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
2e420 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2e430 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  [] */.  u8 *aSpa
2e440 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ce1;            
2e450 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
2e460 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
2e470 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  ders cells */.  
2e480 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
2e490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e4a0 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72  Temp var to stor
2e4b0 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  e a page number 
2e4c0 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  in */..  pBt = p
2e4d0 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61  Parent->pBt;.  a
2e4e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2e4f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2e500 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2e510 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e520 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2e530 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2e540 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28  .#if 0.  TRACE((
2e550 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
2e560 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
2e570 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2e580 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
2e590 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  no));.#endif..  
2e5a0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
2e5b0 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76   pParent may hav
2e5c0 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76  e at most one ov
2e5d0 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64  erflow cell. And
2e5e0 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76   if.  ** this ov
2e5f0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70  erflow cell is p
2e600 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20  resent, it must 
2e610 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  be the cell with
2e620 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61   .  ** index iPa
2e630 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63  rentIdx. This sc
2e640 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f  enario comes abo
2e650 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ut when this fun
2e660 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61  ction.  ** is ca
2e670 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79  lled (indirectly
2e680 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  ) from sqlite3Bt
2e690 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a  reeDelete()..  *
2e6a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  /.  assert( pPar
2e6b0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2e6c0 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  0 || pParent->nO
2e6d0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
2e6e0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
2e6f0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
2e700 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b   pParent->aOvfl[
2e710 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49  0].idx==iParentI
2e720 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f  dx );..  if( !aO
2e730 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20  vflSpace ){.    
2e740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e750 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  MEM;.  }..  /* F
2e760 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
2e770 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
2e780 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
2e790 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
2e7a0 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
2e7b0 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
2e7c0 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
2e7d0 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
2e7e0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
2e7f0 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
2e800 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
2e810 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
2e820 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
2e830 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
2e840 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
2e850 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
2e860 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
2e870 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
2e880 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
2e890 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
2e8a0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
2e8b0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
2e8c0 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  taken.  .  **.  
2e8d0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73  ** This loop als
2e8e0 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69  o drops the divi
2e8f0 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  der cells from t
2e900 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2e910 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74  This.  ** way, t
2e920 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
2e930 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
2e940 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65  s not have to de
2e950 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a  al with any.  **
2e960 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2e970 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  in the parent pa
2e980 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79  ge, since if any
2e990 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69   existed they wi
2e9a0 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72  ll.  ** have alr
2e9b0 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65  eady been remove
2e9c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50  d..  */.  i = pP
2e9d0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2e9e0 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   + pParent->nCel
2e9f0 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a  l;.  if( i<2 ){.
2ea00 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
2ea10 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20     nOld = i+1;. 
2ea20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64   }else{.    nOld
2ea30 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50   = 3;.    if( iP
2ea40 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20  arentIdx==0 ){  
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
2ea60 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b        nxDiv = 0;
2ea70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
2ea80 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a  ParentIdx==i ){.
2ea90 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d        nxDiv = i-
2eaa0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
2eab0 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72      nxDiv = iPar
2eac0 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a  entIdx-1;.    }.
2ead0 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20      i = 2;.  }. 
2eae0 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50   if( (i+nxDiv-pP
2eaf0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2eb00 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  )==pParent->nCel
2eb10 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20  l ){.    pRight 
2eb20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  = &pParent->aDat
2eb30 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2eb40 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65  fset+8];.  }else
2eb50 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66  {.    pRight = f
2eb60 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
2eb70 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2eb80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
2eb90 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62  }.  pgno = get4b
2eba0 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77  yte(pRight);.  w
2ebb0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72  hile( 1 ){.    r
2ebc0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2ebd0 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61  ge(pBt, pgno, &a
2ebe0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
2ebf0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
2ec00 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 69  mset(apOld, 0, i
2ec10 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
2ec20 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
2ec30 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2ec40 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
2ec50 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
2ec60 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
2ec70 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
2ec80 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
2ec90 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
2eca0 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
2ecb0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  t->aOvfl[0].idx 
2ecc0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  && pParent->nOve
2ecd0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  rflow ){.      a
2ece0 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e  pDiv[i] = pParen
2ecf0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  t->aOvfl[0].pCel
2ed00 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  l;.      pgno = 
2ed10 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
2ed20 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
2ed30 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
2ed40 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
2ed50 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  i]);.      pPare
2ed60 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  nt->nOverflow = 
2ed70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2ed80 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
2ed90 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
2eda0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2edb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
2edc0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2edd0 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
2ede0 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
2edf0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2ee00 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
2ee10 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  .      /* Drop t
2ee20 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65  he cell from the
2ee30 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70   parent page. ap
2ee40 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69  Div[i] still poi
2ee50 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
2ee60 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2ee70 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e  the parent, even
2ee80 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62   though it has b
2ee90 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20  een dropped..   
2eea0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61     ** This is sa
2eeb0 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70  fe because dropp
2eec0 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20  ing a cell only 
2eed0 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66  overwrites the f
2eee0 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
2eef0 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20  ur bytes of it, 
2ef00 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
2ef10 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
2ef20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
2ef30 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
2ef40 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2ef50 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65  l. So the pointe
2ef60 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  r is safe to use
2ef70 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20  .      ** later 
2ef80 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20  on.  .      **. 
2ef90 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53       ** Unless S
2efa0 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
2efb0 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  d in secure-dele
2efc0 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  te mode. In this
2efd0 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20   case,.      ** 
2efe0 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
2eff0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
2f000 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
2f010 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
2f020 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
2f030 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
2f040 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
2f050 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
2f060 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
2f070 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
2f080 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
2f090 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
2f0a0 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
2f0b0 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
2f0c0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
2f0d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
2f0e0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
2f0f0 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c     memcpy(&aOvfl
2f100 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
2f110 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 2c 20  Parent->aData], 
2f120 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b  apDiv[i], szNew[
2f130 69 5d 29 3b 0a 20 20 20 20 20 20 61 70 44 69 76  i]);.      apDiv
2f140 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  [i] = &aOvflSpac
2f150 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65  e[apDiv[i]-pPare
2f160 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 23 65 6e 64  nt->aData];.#end
2f170 69 66 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c  if.      dropCel
2f180 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
2f190 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
2f1a0 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
2f1b0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
2f1c0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
2f1d0 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
2f1e0 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
2f1f0 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
2f200 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
2f210 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
2f220 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
2f230 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
2f240 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
2f250 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
2f260 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
2f270 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
2f280 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
2f290 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
2f2a0 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
2f2b0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
2f2c0 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
2f2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
2f2e0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
2f2f0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
2f300 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
2f310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
2f320 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
2f330 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
2f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
2f360 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
2f370 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
2f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2f3a0 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
2f3b0 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
2f3c0 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
2f3d0 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
2f3e0 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
2f3f0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
2f400 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2f410 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2f420 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2f430 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2f440 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
2f450 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
2f460 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
2f470 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
2f480 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2f490 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
2f4a0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
2f4b0 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
2f4c0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
2f4d0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
2f4e0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2f4f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
2f500 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
2f510 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
2f520 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2f530 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2f540 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
2f550 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
2f560 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
2f570 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
2f580 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
2f590 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
2f5a0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
2f5b0 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
2f5c0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
2f5d0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
2f5e0 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
2f5f0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
2f600 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
2f610 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
2f620 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
2f630 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
2f640 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
2f650 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
2f660 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
2f670 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
2f680 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
2f690 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
2f6a0 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
2f6b0 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
2f6c0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2f6d0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
2f6e0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2f6f0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
2f700 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
2f710 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
2f720 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
2f730 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
2f740 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
2f750 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
2f760 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
2f770 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
2f780 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
2f790 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
2f7a0 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
2f7b0 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
2f7c0 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
2f7d0 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
2f7e0 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
2f7f0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2f800 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
2f810 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
2f820 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
2f830 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
2f840 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
2f850 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
2f860 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
2f870 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2f880 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
2f890 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
2f8a0 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
2f8b0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
2f8c0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
2f8d0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
2f8e0 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
2f8f0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
2f900 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
2f910 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
2f920 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
2f930 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
2f940 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
2f950 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
2f960 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
2f970 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
2f980 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
2f990 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
2f9a0 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
2f9b0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
2f9c0 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
2f9d0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
2f9e0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
2f9f0 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
2fa00 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
2fa10 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  w;.    for(j=0; 
2fa20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
2fa30 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2fa40 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
2fa50 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
2fa60 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
2fa70 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
2fa80 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2fa90 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
2faa0 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
2fab0 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 6e  nCell]);.      n
2fac0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
2fad0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26    if( i<nOld-1 &
2fae0 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20  & !leafData){.  
2faf0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31      u16 sz = (u1
2fb00 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  6)szNew[i];.    
2fb10 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
2fb20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2fb30 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2fb40 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
2fb50 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54  ] = sz;.      pT
2fb60 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
2fb70 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69  Space1];.      i
2fb80 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
2fb90 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2fba0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2fbb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2fbc0 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70   iSpace1<=pBt->p
2fbd0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
2fbe0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
2fbf0 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
2fc00 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
2fc10 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f  ] = pTemp+leafCo
2fc20 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
2fc30 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2fc40 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61  ection==0 || lea
2fc50 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2fc60 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2fc70 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e  Cell] = szCell[n
2fc80 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72  Cell] - leafCorr
2fc90 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  ection;.      if
2fca0 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b  ( !pOld->leaf ){
2fcb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2fcc0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2fcd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
2fce0 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f  sert( pOld->hdrO
2fcf0 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
2fd00 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
2fd10 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
2fd20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20  child page pOld 
2fd30 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74  becomes the left
2fd40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e  .        ** poin
2fd50 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64  ter of the divid
2fd60 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20  er cell */.     
2fd70 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c     memcpy(apCell
2fd80 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e  [nCell], &pOld->
2fd90 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20  aData[8], 4);.  
2fda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fdb0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2fdc0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
2fdd0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
2fde0 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20  ll[nCell]<4 ){. 
2fdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2fe00 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c  ot allow any cel
2fe10 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ls smaller than 
2fe20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20  4 bytes. */.    
2fe30 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
2fe40 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll] = 4;.       
2fe50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2fe60 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2fe70 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
2fe80 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75  igure out the nu
2fe90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65  mber of pages ne
2fea0 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  eded to hold all
2feb0 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20   nCell cells..  
2fec0 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75  ** Store this nu
2fed0 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c  mber in "k".  Al
2fee0 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77  so compute szNew
2fef0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
2ff00 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20  total.  ** size 
2ff10 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  of all cells on 
2ff20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e  the i-th page an
2ff30 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68  d cntNew[] which
2ff40 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20   is the index.  
2ff50 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f  ** in apCell[] o
2ff60 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20  f the cell that 
2ff70 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66  divides page i f
2ff80 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a  rom page i+1.  .
2ff90 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73    ** cntNew[k] s
2ffa0 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c  hould equal nCel
2ffb0 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c  l..  **.  ** Val
2ffc0 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ues computed by 
2ffd0 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a  this block:.  **
2ffe0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
2fff0 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d  k: The total num
30000 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70  ber of sibling p
30010 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e  ages.  **    szN
30020 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73  ew[i]: Spaced us
30030 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73  ed on the i-th s
30040 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
30050 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49  *   cntNew[i]: I
30060 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ndex in apCell[]
30070 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f   and szCell[] fo
30080 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  r the first cell
30090 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   to.  **        
300a0 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20        the right 
300b0 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c  of the i-th sibl
300c0 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75  ing page..  ** u
300d0 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62  sableSpace: Numb
300e0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
300f0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  pace available o
30100 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a  n each sibling..
30110 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61    ** .  */.  usa
30120 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e  bleSpace = pBt->
30130 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20  usableSize - 12 
30140 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
30150 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c  ;.  for(subtotal
30160 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  =k=i=0; i<nCell;
30170 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
30180 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( i<nMaxCells )
30190 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b  ;.    subtotal +
301a0 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b  = szCell[i] + 2;
301b0 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61  .    if( subtota
301c0 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20  l > usableSpace 
301d0 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b  ){.      szNew[k
301e0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73  ] = subtotal - s
301f0 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
30200 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20  cntNew[k] = i;. 
30210 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74       if( leafDat
30220 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20  a ){ i--; }.    
30230 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a    subtotal = 0;.
30240 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20        k++;.     
30250 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72   if( k>NB+1 ){ r
30260 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
30270 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
30280 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
30290 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
302a0 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
302b0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
302c0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
302d0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
302e0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
302f0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
30300 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
30310 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
30320 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
30330 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
30340 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
30350 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
30360 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
30370 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
30380 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
30390 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
303a0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
303b0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
303c0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
303d0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
303e0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
303f0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
30400 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
30410 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
30420 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
30430 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
30440 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
30450 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
30460 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
30470 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
30480 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
30490 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
304a0 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
304b0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
304c0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
304d0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
304e0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
304f0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
30500 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
30510 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
30520 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
30530 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
30540 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
30550 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
30560 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
30570 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30590 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
305a0 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
305b0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
305c0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
305d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
305e0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
305f0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
30600 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
30610 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
30620 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
30630 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
30640 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
30650 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
30660 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
30670 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
30680 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
30690 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
306a0 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
306b0 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
306c0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
306d0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
306e0 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
306f0 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
30700 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
30710 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
30720 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
30730 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
30740 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
30750 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
30760 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
30770 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
30780 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
30790 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
307a0 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
307b0 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65  [0])>0) or pPage
307c0 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75   is.  ** a virtu
307d0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
307e0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
307f0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
30800 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
30810 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
30820 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
30830 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
30840 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
30850 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
30860 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
30870 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
30880 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
30890 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
308a0 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
308b0 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
308c0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
308d0 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
308e0 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
308f0 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
30900 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
30910 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
30920 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
30930 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
30940 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
30950 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
30960 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
30970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
30980 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
30990 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
309a0 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67  eanup;.  }.  pag
309b0 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30  eFlags = apOld[0
309c0 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66  ]->aData[0];.  f
309d0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
309e0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
309f0 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c  pNew;.    if( i<
30a00 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e  nOld ){.      pN
30a10 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20  ew = apNew[i] = 
30a20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  apOld[i];.      
30a30 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
30a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30a50 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
30a60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30a70 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
30a80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
30a90 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
30aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
30ab0 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
30ac0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
30ad0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
30ae0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67  &pNew, &pgno, pg
30af0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  no, 0);.      if
30b00 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
30b10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
30b20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
30b30 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
30b40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
30b50 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
30b60 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
30b70 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
30b80 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
30b90 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
30ba0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
30bb0 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
30bc0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
30bd0 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
30be0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30bf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30c00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
30c10 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30c20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30c30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
30c40 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
30c50 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
30c60 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
30c70 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
30c80 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
30c90 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
30ca0 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
30cb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
30cc0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30cd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30ce0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
30cf0 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
30d00 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
30d10 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
30d20 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
30d30 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
30d40 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
30d50 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
30d60 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
30d70 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
30d80 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
30d90 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
30da0 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
30db0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
30dc0 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
30dd0 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
30de0 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
30df0 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
30e00 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
30e10 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
30e20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
30e30 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
30e40 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
30e50 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
30e60 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
30e70 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
30e80 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
30e90 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
30ea0 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
30eb0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
30ec0 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
30ed0 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
30ee0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
30ef0 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
30f00 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
30f10 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
30f20 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
30f30 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
30f40 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
30f50 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
30f60 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
30f70 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
30f80 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
30f90 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
30fa0 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
30fb0 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
30fc0 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
30fd0 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
30fe0 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
30ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31000 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
31010 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65   int t;.      Me
31020 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
31030 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70   t = apNew[i]->p
31040 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d 20  gno;.      pT = 
31050 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  apNew[i];.      
31060 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77  apNew[i] = apNew
31070 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70  [minI];.      ap
31080 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
31090 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
310a0 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20  E(("new: %d(%d) 
310b0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
310c0 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a  (%d) %d(%d)\n",.
310d0 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67      apNew[0]->pg
310e0 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20  no, szNew[0],.  
310f0 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65    nNew>=2 ? apNe
31100 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[1]->pgno : 0, 
31110 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
31120 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
31130 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e  >=3 ? apNew[2]->
31140 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
31150 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30  3 ? szNew[2] : 0
31160 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20  ,.    nNew>=4 ? 
31170 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a  apNew[3]->pgno :
31180 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a   0, nNew>=4 ? sz
31190 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20  New[3] : 0,.    
311a0 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b  nNew>=5 ? apNew[
311b0 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  4]->pgno : 0, nN
311c0 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d  ew>=5 ? szNew[4]
311d0 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72   : 0));..  asser
311e0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
311f0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
31200 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
31210 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68    put4byte(pRigh
31220 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  t, apNew[nNew-1]
31230 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20  ->pgno);..  /*. 
31240 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
31250 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
31260 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
31270 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
31280 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
31290 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
312a0 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
312b0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
312c0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
312d0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
312e0 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
312f0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
31300 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
31310 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
31320 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
31330 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
31340 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
31350 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
31360 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
31370 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
31380 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
31390 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
313a0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
313b0 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
313c0 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
313d0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
313e0 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
313f0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20  ==0 );..    j = 
31400 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
31410 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
31420 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
31430 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
31440 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
31450 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
31460 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
31470 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
31480 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
31490 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
314a0 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c  New-1 || j==nCel
314b0 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e  l );.    if( j<n
314c0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38  Cell ){.      u8
314d0 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75   *pCell;.      u
314e0 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20  8 *pTemp;.      
314f0 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61  int sz;..      a
31500 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
31510 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  ls );.      pCel
31520 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20  l = apCell[j];. 
31530 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c       sz = szCell
31540 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63  [j] + leafCorrec
31550 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d  tion;.      pTem
31560 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  p = &aOvflSpace[
31570 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20  iOvflSpace];.   
31580 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65     if( !pNew->le
31590 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  af ){.        me
315a0 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74  mcpy(&pNew->aDat
315b0 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b  a[8], pCell, 4);
315c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
315d0 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
315e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
315f0 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
31600 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
31610 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
31620 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
31630 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
31640 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
31650 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
31660 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
31670 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
31680 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
31690 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
316a0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
316b0 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
316c0 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
316d0 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
316e0 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
316f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31700 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
31710 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
31720 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
31730 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  llPtr(pNew, apCe
31740 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  ll[j], &info);. 
31750 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70         pCell = p
31760 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a  Temp;.        sz
31770 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74   = 4 + putVarint
31780 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f  (&pCell[4], info
31790 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  .nKey);.        
317a0 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
317b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
317c0 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
317d0 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
317e0 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
317f0 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
31800 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
31810 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
31820 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
31830 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
31840 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
31850 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
31860 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
31870 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
31880 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
31890 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
318a0 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65      ** (see btre
318b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
318c0 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
318d0 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
318e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
318f0 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
31900 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
31910 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
31920 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
31930 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
31940 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
31950 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
31960 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
31970 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
31980 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
31990 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
319a0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
319b0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
319c0 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
319d0 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
319e0 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
319f0 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
31a00 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
31a10 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
31a20 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
31a30 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
31a40 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
31a50 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
31a60 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
31a70 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
31a80 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
31a90 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
31aa0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
31ab0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31ac0 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d     iOvflSpace +=
31ad0 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
31ae0 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
31af0 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
31b00 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
31b10 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce<=pBt->pageSiz
31b20 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72  e );.      inser
31b30 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
31b40 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
31b50 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67   pTemp, pNew->pg
31b60 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
31b70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31b80 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
31b90 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
31ba0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31bb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31bc0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
31bd0 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
31be0 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
31bf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
31c00 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
31c10 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
31c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
31c30 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
31c40 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
31c50 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
31c60 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
31c70 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
31c80 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
31c90 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
31ca0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
31cb0 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
31cc0 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
31cd0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
31ce0 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
31cf0 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
31d00 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
31d10 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
31d20 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
31d30 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
31d40 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
31d50 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
31d60 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
31d70 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
31d80 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
31d90 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
31da0 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
31db0 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
31dc0 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
31dd0 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
31de0 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
31df0 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
31e00 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
31e10 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
31e20 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
31e30 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
31e40 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
31e50 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
31e60 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
31e70 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
31e80 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
31e90 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
31ea0 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
31eb0 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
31ec0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
31ed0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
31ee0 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
31ef0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
31f00 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
31f10 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
31f20 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
31f30 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
31f40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
31f50 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
31f60 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
31f70 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
31f80 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
31f90 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
31fa0 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
31fb0 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
31fc0 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
31fd0 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
31fe0 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
31ff0 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
32000 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
32010 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
32020 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
32030 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
32040 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
32050 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
32060 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
32070 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
32080 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
32090 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
320a0 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
320b0 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
320c0 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
320d0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
320e0 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e  apNew[0], pParen
320f0 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65  t, &rc);.    fre
32100 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20  ePage(apNew[0], 
32110 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  &rc);.  }else if
32120 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
32130 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65  {.    /* Fix the
32140 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32150 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
32160 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65   cells that were
32170 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e   shifted around.
32180 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61   .    ** There a
32190 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  re several diffe
321a0 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f  rent types of po
321b0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
321c0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20  s that need to. 
321d0 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
321e0 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74  ith by this rout
321f0 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65  ine. Some of the
32200 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  se have been set
32210 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20   already, but.  
32220 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e    ** many have n
32230 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot. The followin
32240 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a  g is a summary:.
32250 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
32260 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61  1) The entries a
32270 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e  ssociated with n
32280 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ew sibling pages
32290 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20   that were not. 
322a0 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69     **      sibli
322b0 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75  ngs when this fu
322c0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
322d0 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c  d. These have al
322e0 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20  ready.    **    
322f0 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64    been set. We d
32300 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72  on't need to wor
32310 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62  ry about old sib
32320 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a  lings that were.
32330 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65      **      move
32340 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
32350 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67  st - the freePag
32360 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b  e() code has tak
32370 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20  en care.    **  
32380 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20      of those..  
32390 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29    **.    **   2)
323a0 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   The pointer-map
323b0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
323c0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
323d0 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  st overflow.    
323e0 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20  **      page in 
323f0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  any overflow cha
32400 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20  ins used by new 
32410 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54  divider cells. T
32420 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20  hese .    **    
32430 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65    have also alre
32440 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63  ady been taken c
32450 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e  are of by the in
32460 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e  sertCell() code.
32470 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32480 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   3) If the sibli
32490 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
324a0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
324b0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  e child pages of
324c0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c  .    **      cel
324d0 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ls stored on the
324e0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d   sibling pages m
324f0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
32500 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
32510 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65    **   4) If the
32520 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
32530 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20  re not internal 
32540 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68  intkey nodes, th
32550 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20  en any.    **   
32560 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
32570 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20  s used by these 
32580 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74  cells may need t
32590 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20  o be updated.   
325a0 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e   **      (intern
325b0 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20  al intkey nodes 
325c0 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f  never contain po
325d0 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c  inters to overfl
325e0 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a  ow pages)..    *
325f0 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66  *.    **   5) If
32600 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32610 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
32620 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  s, then the poin
32630 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20  ter-map.    **  
32640 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20      entries for 
32650 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
32660 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69  pages of each si
32670 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20  bling may need. 
32680 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65     **      to be
32690 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
326a0 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20  .    ** Cases 1 
326b0 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20  and 2 are dealt 
326c0 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74  with above by ot
326d0 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65  her code. The ne
326e0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
326f0 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
32700 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65   3 and 4 and the
32710 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c   one after that,
32720 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20   case 5. Since. 
32730 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20     ** setting a 
32740 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
32750 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c  y is a relativel
32760 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  y expensive oper
32770 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20  ation, this.    
32780 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74  ** code only set
32790 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  s pointer map en
327a0 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20  tries for child 
327b0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
327c0 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
327d0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65  ** actually move
327e0 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e  d between pages.
327f0 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
32800 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30   *pNew = apNew[0
32810 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ];.    MemPage *
32820 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d  pOld = apCopy[0]
32830 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66  ;.    int nOverf
32840 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
32850 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
32860 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e  NextOld = pOld->
32870 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f  nCell + nOverflo
32880 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72  w;.    int iOver
32890 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f  flow = (nOverflo
328a0 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  w ? pOld->aOvfl[
328b0 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20  0].idx : -1);.  
328c0 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20    j = 0;        
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
328f0 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61  'old' sibling pa
32900 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b  ge */.    k = 0;
32910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32930 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69  Current 'new' si
32940 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20  bling page */.  
32950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
32960 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
32970 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d 20  int isDivider = 
32980 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
32990 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20  i==iNextOld ){. 
329a0 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
329b0 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d   is the cell imm
329c0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
329d0 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  ng the last cell
329e0 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20   on old.        
329f0 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ** sibling page 
32a00 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  j. If the siblin
32a10 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20  gs are not leaf 
32a20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20  pages of an.    
32a30 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d      ** intkey b-
32a40 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20  tree, then cell 
32a50 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72 20  i was a divider 
32a60 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
32a70 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b   pOld = apCopy[+
32a80 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  +j];.        iNe
32a90 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61  xtOld = i + !lea
32aa0 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43  fData + pOld->nC
32ab0 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65  ell + pOld->nOve
32ac0 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  rflow;.        i
32ad0 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  f( pOld->nOverfl
32ae0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
32af0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
32b00 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
32b10 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
32b20 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
32b30 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30   + pOld->aOvfl[0
32b40 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d  ].idx;.        }
32b50 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
32b60 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20  er = !leafData; 
32b70 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
32b80 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
32b90 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77  w>0 || iOverflow
32ba0 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  <i );.      asse
32bb0 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c  rt(nOverflow<2 |
32bc0 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  | pOld->aOvfl[0]
32bd0 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
32be0 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[1].idx-1);.   
32bf0 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
32c00 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61  low<3 || pOld->a
32c10 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c  Ovfl[1].idx==pOl
32c20 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d  d->aOvfl[2].idx-
32c30 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  1);.      if( i=
32c40 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  =iOverflow ){.  
32c50 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
32c60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
32c70 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30   (--nOverflow)>0
32c80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
32c90 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20  verflow++;.     
32ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
32cb0 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65      if( i==cntNe
32cc0 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  w[k] ){.        
32cd0 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
32ce0 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
32cf0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
32d00 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77  last cell on new
32d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
32d20 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74  ing page k. If t
32d30 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
32d40 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
32d50 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
32d60 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
32d70 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20  hen cell i is a 
32d80 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a  divider cell.  *
32d90 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
32da0 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20   apNew[++k];.   
32db0 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44 61       if( !leafDa
32dc0 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ta ) continue;. 
32dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
32de0 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20  ert( j<nOld );. 
32df0 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
32e00 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  New );..      /*
32e10 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   If the cell was
32e20 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69   originally divi
32e30 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73  der cell (and is
32e40 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20   not now) or.   
32e50 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f     ** an overflo
32e60 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68  w cell, or if th
32e70 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74  e cell was locat
32e80 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ed on a differen
32e90 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20  t sibling.      
32ea0 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74  ** page before t
32eb0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  he balancing, th
32ec0 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  en the pointer m
32ed0 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  ap entries assoc
32ee0 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77  iated.      ** w
32ef0 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72  ith any child or
32f00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
32f10 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
32f20 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  ed.  */.      if
32f30 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70  ( isDivider || p
32f40 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  Old->pgno!=pNew-
32f50 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
32f60 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
32f70 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
32f80 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
32f90 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c   get4byte(apCell
32fa0 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52  [i]), PTRMAP_BTR
32fb0 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  EE, pNew->pgno, 
32fc0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
32fd0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
32fe0 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  ll[i]>pNew->minL
32ff0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
33000 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
33010 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
33020 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  i], &rc);.      
33030 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33040 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66  }..    if( !leaf
33050 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
33060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
33070 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  New; i++){.     
33080 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74     u32 key = get
33090 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d  4byte(&apNew[i]-
330a0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
330b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
330c0 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42  t, key, PTRMAP_B
330d0 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e  TREE, apNew[i]->
330e0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
330f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30    }.    }..#if 0
33100 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d  .    /* The ptrm
33110 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20 63  apCheckPages() c
33120 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28 29  ontains assert()
33130 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
33140 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20   verify that.   
33150 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20   ** all pointer 
33160 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73 65  map pages are se
33170 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69  t correctly. Thi
33180 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69  s is helpful whi
33190 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67  le .    ** debug
331a0 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73  ging. This is us
331b0 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62  ually disabled b
331c0 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70 74  ecause a corrupt
331d0 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20   database may.  
331e0 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73    ** cause an as
331f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
33200 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20   to fail.  */.  
33210 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
33220 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b  es(apNew, nNew);
33230 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b  .    ptrmapCheck
33240 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20  Pages(&pParent, 
33250 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  1);.#endif.  }..
33260 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
33270 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54  t->isInit );.  T
33280 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
33290 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64  finished: old=%d
332a0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
332b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
332c0 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
332d0 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ));..  /*.  ** C
332e0 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
332f0 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
33300 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
33310 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
33320 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
33330 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
33340 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
33350 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
33360 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
33370 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
33380 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
33390 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20  New[i]);.  }..  
333a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
333b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
333c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
333d0 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  n the root page 
333e0 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72 75  of a b-tree stru
333f0 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72  cture is.** over
33400 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72  full (has one or
33410 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
33420 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ages)..**.** A n
33430 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  ew child page is
33440 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
33450 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
33460 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a  he current root.
33470 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69  ** page, includi
33480 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ng overflow cell
33490 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e  s, are copied in
334a0 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68  to the child. Th
334b0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
334c0 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74  s then overwritt
334d0 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e  en to make it an
334e0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
334f0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
33500 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69   .** pointer poi
33510 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nting to the new
33520 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66   page..**.** Bef
33530 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61  ore returning, a
33540 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ll pointer-map e
33550 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e  ntries correspon
33560 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a  ding to pages .*
33570 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63  * that the new c
33580 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f  hild-page now co
33590 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
335a0 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e 20  to are updated. 
335b0 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72  The.** entry cor
335c0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
335d0 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
335e0 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  d pointer of the
335f0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73   root.** page is
33600 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a   also updated..*
33610 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
33620 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20  ul, *ppChild is 
33630 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  set to contain a
33640 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
33650 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65  e child .** page
33660 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
33670 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
33680 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61 6c  his case the cal
33690 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64 0a  ler is required.
336a0 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  ** to call relea
336b0 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43  sePage() on *ppC
336c0 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  hild exactly onc
336d0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
336e0 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72  ccurs,.** an err
336f0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
33700 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64  ned and *ppChild
33710 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
33720 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
33730 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61  nce_deeper(MemPa
33740 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61  ge *pRoot, MemPa
33750 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20  ge **ppChild){. 
33760 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
33770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33780 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
33790 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
337a0 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
337b0 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20  *pChild = 0;    
337c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
337d0 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  r to a new child
337e0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
337f0 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
33800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
33810 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
33820 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
33830 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
33840 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20  t = pRoot->pBt; 
33850 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
33860 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52  */..  assert( pR
33870 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  oot->nOverflow>0
33880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
33890 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
338a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
338b0 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74  .  /* Make pRoot
338c0 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  , the root page 
338d0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77  of the b-tree, w
338e0 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74  ritable. Allocat
338f0 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61  e a new .  ** pa
33900 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  ge that will bec
33910 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67 68  ome the new righ
33920 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65  t-child of pPage
33930 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
33940 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
33950 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70  node stored on p
33960 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  Root into the ne
33970 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  w child page..  
33980 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
33990 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
339a0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  t->pDbPage);.  i
339b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
339c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   ){.    rc = all
339d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
339e0 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f  Bt,&pChild,&pgno
339f0 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e  Child,pRoot->pgn
33a00 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f  o,0);.    copyNo
33a10 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c  deContent(pRoot,
33a20 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20   pChild, &rc);. 
33a30 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
33a40 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72  UUM ){.      ptr
33a50 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
33a60 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54  Child, PTRMAP_BT
33a70 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  REE, pRoot->pgno
33a80 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
33a90 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
33aa0 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a    *ppChild = 0;.
33ab0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33ac0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  pChild);.    ret
33ad0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
33ae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
33af0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
33b00 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
33b10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33b20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33b30 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
33b40 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
33b50 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
33b60 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pRoot->nCell );.
33b70 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
33b80 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
33b90 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f   into %d\n", pRo
33ba0 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ot->pgno, pChild
33bb0 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20  ->pgno));..  /* 
33bc0 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f  Copy the overflo
33bd0 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f  w cells from pRo
33be0 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a  ot to pChild */.
33bf0 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
33c00 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61  >aOvfl, pRoot->a
33c10 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76  Ovfl, pRoot->nOv
33c20 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
33c30 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  oot->aOvfl[0]));
33c40 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
33c50 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f  flow = pRoot->nO
33c60 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a  verflow;..  /* Z
33c70 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
33c80 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20   of pRoot. Then 
33c90 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61  install pChild a
33ca0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
33cb0 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65  d. */.  zeroPage
33cc0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e  (pRoot, pChild->
33cd0 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
33ce0 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
33cf0 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
33d00 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
33d10 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
33d20 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70  ..  *ppChild = p
33d30 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Child;.  return 
33d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33d50 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
33d60 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
33d70 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
33d80 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
33d90 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
33da0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
33db0 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
33dc0 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
33dd0 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
33de0 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
33df0 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
33e00 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
33e10 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
33e20 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  ng .** routine. 
33e30 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  Balancing routin
33e40 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
33e50 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a  balance_quick().
33e60 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65  **   balance_dee
33e70 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  per().**   balan
33e80 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a  ce_nonroot().*/.
33e90 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
33ea0 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
33eb0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
33ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
33ed0 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75  t int nMin = pCu
33ee0 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
33ef0 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38  ze * 2 / 3;.  u8
33f00 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33f10 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70  ace[13];.  u8 *p
33f20 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53  Free = 0;..  TES
33f30 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
33f40 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20  ce_quick_called 
33f50 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  = 0 );.  TESTONL
33f60 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  Y( int balance_d
33f70 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30  eeper_called = 0
33f80 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
33f90 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
33fa0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d  ->iPage;.    Mem
33fb0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
33fc0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
33fd0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67  ];..    if( iPag
33fe0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e==0 ){.      if
33ff0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
34000 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ow ){.        /*
34010 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
34020 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
34030 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69  overfull. In thi
34040 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a  s case call the.
34050 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
34060 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63  ce_deeper() func
34070 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
34080 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74   new child for t
34090 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
340a0 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79       ** and copy
340b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
340c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
340d0 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68  t-page to it. Th
340e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78  e.        ** nex
340f0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
34100 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
34110 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c  balance the chil
34120 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  d page..        
34130 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  */ .        asse
34140 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  rt( (balance_dee
34150 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  per_called++)==0
34160 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
34170 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
34180 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70  pPage, &pCur->ap
34190 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Page[1]);.      
341a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
341b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
341c0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31   pCur->iPage = 1
341d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
341e0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
341f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
34200 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20  aiIdx[1] = 0;.  
34210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34220 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d  pCur->apPage[1]-
34230 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
34240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
34250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65  lse{.        bre
34260 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
34270 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d  }else if( pPage-
34280 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
34290 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e   pPage->nFree<=n
342a0 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65  Min ){.      bre
342b0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
342c0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63       MemPage * c
342d0 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70  onst pParent = p
342e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
342f0 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  e-1];.      int 
34300 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75  const iIdx = pCu
34310 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31  r->aiIdx[iPage-1
34320 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ];..      rc = s
34330 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34340 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
34350 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
34370 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34380 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
34390 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
343a0 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20  e->hasData.     
343b0 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f      && pPage->nO
343c0 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20  verflow==1.     
343d0 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f      && pPage->aO
343e0 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
343f0 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  e->nCell.       
34400 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67    && pParent->pg
34410 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26  no!=1.         &
34420 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
34430 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29  ==iIdx.        )
34440 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
34450 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  all balance_quic
34460 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20  k() to create a 
34470 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70  new sibling of p
34480 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20  Page on which.  
34490 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74          ** to st
344a0 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ore the overflow
344b0 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71   cell. balance_q
344c0 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61  uick() inserts a
344d0 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20   new cell.      
344e0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72      ** into pPar
344f0 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
34500 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65  ause pParent ove
34510 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20  rflow. If this. 
34520 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
34530 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e  ens, the next in
34540 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
34550 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
34560 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20  ance pParent .  
34570 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65          ** use e
34580 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f  ither balance_no
34590 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e  nroot() or balan
345a0 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74  ce_deeper(). Unt
345b0 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  il this.        
345c0 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
345d0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
345e0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
345f0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
34600 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  ace[].          
34610 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  ** buffer. .    
34620 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34630 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73     ** The purpos
34640 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
34650 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74  ng assert() is t
34660 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c  o check that onl
34670 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
34680 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
34690 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
346a0 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68  is made for each
346b0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
346c0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
346d0 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72  ion. If this wer
346e0 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20  e not verified, 
346f0 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76  a subtle bug inv
34700 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20  olving reuse.   
34710 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
34720 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
34730 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61  ace[] might snea
34740 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  k in..          
34750 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
34760 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75  ert( (balance_qu
34770 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  ick_called++)==0
34780 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
34790 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b   = balance_quick
347a0 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c  (pParent, pPage,
347b0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
347c0 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ace);.        }e
347d0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
347e0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
347f0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
34800 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  call balance_non
34810 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74  root() to redist
34820 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20  ribute cells.   
34830 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
34840 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
34850 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69  o 2 of its sibli
34860 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69  ng pages. This i
34870 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20  nvolves.        
34880 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74    ** modifying t
34890 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
348a0 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
348b0 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
348c0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
348d0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
348e0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68  or underfull. Th
348f0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
34900 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a   of the do-loop.
34910 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c            ** wil
34920 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  l balance the pa
34930 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72  rent page to cor
34940 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20  rect this..     
34950 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
34960 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72     ** If the par
34970 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
34980 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f   overfull, the o
34990 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20  verflow cell or 
349a0 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
349b0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
349c0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
349d0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d  er allocated imm
349e0 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20  ediately below. 
349f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20  .          ** A 
34a00 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
34a10 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
34a20 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69  oop will deal wi
34a30 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  th this by.     
34a40 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
34a50 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34a60 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ) (balance_deepe
34a70 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  r() may be calle
34a80 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20  d first,.       
34a90 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65     ** but it doe
34aa0 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f  sn't deal with o
34ab0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20  verflow cells - 
34ac0 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20  just moves them 
34ad0 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  to a.          *
34ae0 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  * different page
34af0 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62  ). Once this sub
34b00 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
34b10 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34b20 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
34b30 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69  has completed, i
34b40 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c  t is safe to rel
34b50 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20  ease the pSpace 
34b60 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20  buffer used by. 
34b70 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
34b80 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61  previous call, a
34b90 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  s the overflow c
34ba0 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61  ell data will ha
34bb0 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  ve been .       
34bc0 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74     ** copied eit
34bd0 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  her into the bod
34be0 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
34bf0 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65  page or into the
34c00 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a   new.          *
34c10 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  * pSpace buffer 
34c20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61  passed to the la
34c30 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c  tter call to bal
34c40 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a  ance_nonroot()..
34c50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
34c60 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63         u8 *pSpac
34c70 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
34c80 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d  alloc(pCur->pBt-
34c90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
34ca0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
34cb0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65  ce_nonroot(pPare
34cc0 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65  nt, iIdx, pSpace
34cd0 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20  , iPage==1);.   
34ce0 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65         if( pFree
34cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34d00 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e  /* If pFree is n
34d10 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
34d20 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65  ts to the pSpace
34d30 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20   buffer used .  
34d40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
34d50 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20  a previous call 
34d60 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
34d70 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e  ot(). Its conten
34d80 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20  ts are.         
34d90 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64     ** now stored
34da0 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20   either on real 
34db0 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f  database pages o
34dc0 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20  r within the .  
34dd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77            ** new
34de0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20   pSpace buffer, 
34df0 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66  so it may be saf
34e00 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20  ely freed here. 
34e10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
34e20 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
34e30 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
34e40 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
34e50 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
34e60 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  er will be freed
34e70 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20   after the next 
34e80 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
34e90 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e    ** balance_non
34ea0 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20  root(), or just 
34eb0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
34ec0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68  tion returns, wh
34ed0 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20  ichever.        
34ee0 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74    ** comes first
34ef0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
34f00 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20  Free = pSpace;. 
34f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34f20 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ..      pPage->n
34f30 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
34f40 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
34f50 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34f60 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63  e do-loop balanc
34f70 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
34f80 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c  ge. */.      rel
34f90 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34fa0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61  .      pCur->iPa
34fb0 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  ge--;.    }.  }w
34fc0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
34fd0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46  _OK );..  if( pF
34fe0 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
34ff0 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
35000 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35010 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rc;.}.../*.** In
35020 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
35030 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
35040 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
35050 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
35060 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
35070 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
35080 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
35090 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
350a0 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
350b0 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
350c0 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
350d0 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
350e0 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
350f0 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
35100 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
35110 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
35120 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
35130 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
35140 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
35150 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
35160 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
35170 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
35180 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
35190 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
351a0 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  both ignored..**
351b0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
351c0 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
351d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
351e0 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63  n a successful c
351f0 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f  all to.** Moveto
35200 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65  Unpacked() to se
35210 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74  ek cursor pCur t
35220 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68  o (pKey, nKey) h
35230 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
35240 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65  en performed. se
35250 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  ekResult is the 
35260 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65  search result re
35270 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69  turned (a negati
35280 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20  ve.** number if 
35290 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
352a0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20  n entry that is 
352b0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b  smaller than (pK
352c0 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a  ey, nKey), or.**
352d0 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
352e0 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  e if pCur points
352f0 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74   at an etry that
35300 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
35310 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29  .** (pKey, nKey)
35320 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ). .**.** If the
35330 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
35340 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
35350 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79   cursor pCur may
35360 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a   point to any .*
35370 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f  * entry or to no
35380 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49   entry at all. I
35390 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
353a0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f   function has to
353b0 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72   seek.** the cur
353c0 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e  sor before the n
353d0 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e  ew key can be in
353e0 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
353f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
35400 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
35410 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
35420 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
35430 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
35440 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
35450 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
35460 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
35470 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
35480 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
35490 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
354a0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
354b0 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
354c0 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
354d0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
354e0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
354f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35500 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
35510 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
35520 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
35530 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20  pendBias,       
35540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
35550 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
35560 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
35570 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74    int seekResult
35580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35590 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
355a0 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  ior MovetoUnpack
355b0 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a  ed() call */.){.
355c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
355d0 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74  loc = seekResult
355e0 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
355f0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
35600 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
35610 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
35620 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
35630 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35640 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35650 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
35660 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
35670 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
35680 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
35690 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
356a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
356b0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
356c0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72  _OK );.    retur
356d0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
356e0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
356f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
35700 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
35710 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
35720 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
35730 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
35740 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65  RITE && !pBt->re
35750 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
35760 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
35770 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70  heTableLock(p, p
35780 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
35790 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30  Cur->pKeyInfo!=0
357a0 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  , 2) );..  /* As
357b0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
357c0 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f  ller has been co
357d0 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69  nsistent. If thi
357e0 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  s cursor was ope
357f0 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69  ned.  ** expecti
35800 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  ng an index b-tr
35810 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ee, then the cal
35820 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
35830 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a  serting blob.  *
35840 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61  * keys with no a
35850 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
35860 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  If the cursor wa
35870 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69  s opened expecti
35880 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65  ng an.  ** intke
35890 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c  y table, the cal
358a0 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
358b0 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20  serting integer 
358c0 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a  keys with a.  **
358d0 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61   blob of associa
358e0 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  ted data.  */.  
358f0 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30  assert( (pKey==0
35900 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
35910 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
35920 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
35930 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
35940 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
35950 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
35960 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  b .  ** cursors 
35970 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
35980 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28  being replaced (
35990 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73  assuming this is
359a0 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20   a replace.  ** 
359b0 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69  operation - if i
359c0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f  t is not, the fo
359d0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d  llowing is a no-
359e0 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  op).  */.  if( p
359f0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
35a00 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
35a10 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
35a20 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
35a30 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20  oot, nKey, 0);. 
35a40 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
35a50 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
35a60 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
35a70 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
35a80 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
35a90 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
35aa0 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d  e call to btreeM
35ab0 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
35ac0 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
35ad0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
35ae0 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
35af0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
35b00 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
35b10 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
35b20 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
35b30 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
35b40 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
35b50 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
35b60 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
35b70 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
35b80 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
35b90 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
35ba0 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
35bb0 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
35bc0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
35bd0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72  In this case btr
35be0 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67  eeMoveto() recog
35bf0 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  nizes.  ** that 
35c00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
35c10 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e  ready where it n
35c20 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72  eeds to be and r
35c30 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20  eturns without. 
35c40 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f   ** doing any wo
35c50 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77  rk. To avoid thw
35c60 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74  arting these opt
35c70 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69  imizations, it i
35c80 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a  s important.  **
35c90 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68   not to clear th
35ca0 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20  e cursor here.. 
35cb0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41   */.  rc = saveA
35cc0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
35cd0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
35ce0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
35cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
35d00 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63  ( !loc ){.    rc
35d10 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
35d20 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
35d30 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
35d40 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
35d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35d60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
35d70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
35d80 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65  ALID || (pCur->e
35d90 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
35da0 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b  VALID && loc) );
35db0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
35dc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
35dd0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
35de0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
35df0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
35e00 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
35e10 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
35e20 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45  tKey );..  TRACE
35e30 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
35e40 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
35e50 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
35e60 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
35e70 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
35e80 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
35e90 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
35ea0 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
35eb0 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
35ec0 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
35ed0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
35ee0 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
35ef0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
35f00 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
35f10 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
35f20 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
35f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35f40 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
35f50 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
35f60 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
35f70 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
35f80 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
35f90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
35fa0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
35fb0 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
35fc0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
35fd0 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
35fe0 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
35ff0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
36000 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
36010 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
36020 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  ];.  if( loc==0 
36030 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
36040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
36050 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
36060 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
36070 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
36080 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36090 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
360a0 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
360b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
360c0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
360d0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
360e0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
360f0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
36100 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
36110 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
36120 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
36130 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
36140 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
36150 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
36160 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64   oldCell);.    d
36170 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
36180 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b  dx, szOld, &rc);
36190 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
361a0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
361b0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
361c0 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
361d0 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
361e0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
361f0 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
36200 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
36210 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page];.  }else{.
36220 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36230 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
36240 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
36250 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
36260 20 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72   szNew, 0, 0, &r
36270 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  c);.  assert( rc
36280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
36290 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
362a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
362b0 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  w>0 );..  /* If 
362c0 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
362d0 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68  ured and pPage h
362e0 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  as an overflow c
362f0 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ell, call balanc
36300 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64  e() .  ** to red
36310 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65  istribute the ce
36320 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  lls within the t
36330 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e  ree. Since balan
36340 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20  ce() may move.  
36350 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a  ** the cursor, z
36360 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72  ero the BtCursor
36370 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20  .info.nSize and 
36380 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b  BtCursor.validNK
36390 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ey.  ** variable
363a0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65  s..  **.  ** Pre
363b0 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
363c0 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20  f SQLite called 
363d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20  moveToRoot() to 
363e0 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a  move the cursor.
363f0 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65    ** back to the
36400 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61   root page as ba
36410 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20  lance() used to 
36420 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
36430 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
36440 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b  BtCursor.apPage[
36450 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61  ] and BtCursor.a
36460 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20  iIdx[]. Instead 
36470 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20  of doing that,. 
36480 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73   ** set the curs
36490 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76  or state to "inv
364a0 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65  alid". This make
364b0 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20  s common insert 
364c0 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  operations.  ** 
364d0 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e  slightly faster.
364e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
364f0 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
36500 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
36510 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
36520 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
36530 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
36540 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
36550 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
36560 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
36570 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
36580 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
36590 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
365a0 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
365b0 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
365c0 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
365d0 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
365e0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
365f0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
36600 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
36610 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
36620 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
36630 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
36640 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
36650 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
36660 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
36670 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
36680 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
36690 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
366a0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
366b0 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
366c0 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
366d0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
366e0 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
366f0 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
36700 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
36710 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
36720 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
36730 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
36740 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
36750 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
36760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36770 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
36780 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20  rflow ){.    rc 
36790 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
367a0 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61  ..    /* Must ma
367b0 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
367c0 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
367d0 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
367e0 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20  alance().    ** 
367f0 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20  fails. Internal 
36800 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
36810 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
36820 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
36830 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73   .    ** Also, s
36840 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
36850 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20  ate to invalid. 
36860 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43  This stops saveC
36870 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
36880 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
36890 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63  ng to save the c
368a0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
368b0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
368c0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  */.    pCur->apP
368d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
368e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
368f0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
36900 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
36910 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ID;.  }.  assert
36920 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
36930 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
36940 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e  erflow==0 );..en
36950 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
36960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36970 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
36980 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
36990 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
369a0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
369b0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
369c0 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
369d0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
369e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
369f0 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
36a00 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20  ur){.  Btree *p 
36a10 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
36a20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
36a30 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
36a40 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63         .  int rc
36a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36a70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
36a80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
36a90 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
36aa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36ab0 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66  to delete cell f
36ac0 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rom */.  unsigne
36ad0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20  d char *pCell;  
36ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36af0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
36b00 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
36b10 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20  int iCellIdx;   
36b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b30 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
36b40 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
36b50 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65  */.  int iCellDe
36b60 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
36b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
36b80 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61  th of node conta
36b90 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a  ining pCell */ .
36ba0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
36bb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
36bc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36bd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
36be0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
36bf0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
36c00 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
36c10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
36c20 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74  Flag );.  assert
36c30 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
36c40 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
36c50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
36c60 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
36c70 32 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  2) );.  assert( 
36c80 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
36c90 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
36ca0 6f 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  oot) );..  if( N
36cb0 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
36cc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
36cd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
36ce0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29  ->iPage]->nCell)
36cf0 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43   .   || NEVER(pC
36d00 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
36d10 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20  OR_VALID).  ){. 
36d20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36d30 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65  _ERROR;  /* Some
36d40 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
36d50 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  wry. */.  }..  /
36d60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
36d70 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
36d80 74 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20  to remove a row 
36d90 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74  from a table b-t
36da0 72 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69  ree,.  ** invali
36db0 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
36dc0 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
36dd0 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
36de0 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69  deleted.  */.  i
36df0 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
36e00 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
36e10 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
36e20 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70  rsors(p, pCur->p
36e30 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69  gnoRoot, pCur->i
36e40 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  nfo.nKey, 0);.  
36e50 7d 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20  }..  iCellDepth 
36e60 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
36e70 20 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72   iCellIdx = pCur
36e80 2d 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70  ->aiIdx[iCellDep
36e90 74 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  th];.  pPage = p
36ea0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
36eb0 6c 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c  lDepth];.  pCell
36ec0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
36ed0 65 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20  e, iCellIdx);.. 
36ee0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
36ef0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
36f00 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69  ntry to delete i
36f10 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
36f20 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  e, move.  ** the
36f30 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
36f40 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20  argest entry in 
36f50 74 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73  the tree that is
36f60 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20   smaller than.  
36f70 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69  ** the entry bei
36f80 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
36f90 20 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61   cell will repla
36fa0 63 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  ce the cell bein
36fb0 67 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66  g deleted.  ** f
36fc0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
36fd0 20 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76   node. The 'prev
36fe0 69 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75  ious' entry is u
36ff0 73 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73  sed for this ins
37000 74 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tead.  ** of the
37010 20 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61   'next' entry, a
37020 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  s the previous e
37030 6e 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61  ntry is always a
37040 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a   part of the.  *
37050 2a 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  * sub-tree heade
37060 64 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70  d by the child p
37070 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  age of the cell 
37080 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54  being deleted. T
37090 68 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62  his makes.  ** b
370a0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65  alancing the tre
370b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
370c0 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e  delete operation
370d0 20 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69   easier.  */.  i
370e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
370f0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  ){.    int notUs
37100 65 64 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ed;.    rc = sql
37110 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
37120 73 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  s(pCur, &notUsed
37130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
37140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
37150 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
37160 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
37170 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
37180 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
37190 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69  before.  ** maki
371a0 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ng any modificat
371b0 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70  ions. Make the p
371c0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
371d0 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a  he entry to be .
371e0 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69    ** deleted wri
371f0 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65  table. Then free
37200 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
37210 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
37220 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e  ith the .  ** en
37230 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  try and finally 
37240 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20  remove the cell 
37250 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68  itself from with
37260 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a 20  in the page.  . 
37270 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41   */.  rc = saveA
37280 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
37290 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
372a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
372b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
372c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
372d0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
372e0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
372f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
37300 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
37310 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 64 72  ge, pCell);.  dr
37320 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  opCell(pPage, iC
37330 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a 65  ellIdx, cellSize
37340 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
37350 29 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72  ), &rc);.  if( r
37360 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
37370 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
37380 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74   deleted was not
37390 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
373a0 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  af page, then th
373b0 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73  e cursor.  ** is
373c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
373d0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65  ing to the large
373e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
373f0 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a  sub-tree headed.
37400 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c    ** by the chil
37410 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65  d-page of the ce
37420 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74  ll that was just
37430 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e   deleted from an
37440 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
37450 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72  ode. The cell fr
37460 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  om the leaf node
37470 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76   needs to be mov
37480 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
37490 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20  al.  ** node to 
374a0 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65  replace the dele
374b0 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  ted cell.  */.  
374c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
374d0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
374e0 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61  *pLeaf = pCur->a
374f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
37500 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c  e];.    int nCel
37510 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20  l;.    Pgno n = 
37520 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65  pCur->apPage[iCe
37530 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f  llDepth+1]->pgno
37540 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
37550 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20  har *pTmp;..    
37560 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
37570 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
37580 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65  Cell-1);.    nCe
37590 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
375a0 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a  (pLeaf, pCell);.
375b0 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
375c0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e  ELL_SIZE(pBt)>=n
375d0 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c  Cell );..    all
375e0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
375f0 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20  Bt);.    pTmp = 
37600 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
37610 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37620 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
37630 66 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  f->pDbPage);.   
37640 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
37650 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70 43 65  e, iCellIdx, pCe
37660 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70  ll-4, nCell+4, p
37670 54 6d 70 2c 20 6e 2c 20 26 72 63 29 3b 0a 20 20  Tmp, n, &rc);.  
37680 20 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66    dropCell(pLeaf
37690 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31  , pLeaf->nCell-1
376a0 2c 20 6e 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , nCell, &rc);. 
376b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
376c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
376d0 20 42 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65   Balance the tre
376e0 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 20  e. If the entry 
376f0 64 65 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61  deleted was loca
37700 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61  ted on a leaf pa
37710 67 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ge,.  ** then th
37720 65 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70  e cursor still p
37730 6f 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61  oints to that pa
37740 67 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ge. In this case
37750 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
37760 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28  call to balance(
37770 29 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72  ) repairs the tr
37780 65 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e  ee, and the if(.
37790 2e 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ..) condition is
377a0 0a 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 65  .  ** never true
377b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65  ..  **.  ** Othe
377c0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 65 6e  rwise, if the en
377d0 74 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20  try deleted was 
377e0 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  on an internal n
377f0 6f 64 65 20 70 61 67 65 2c 20 74 68 65 6e 0a 20  ode page, then. 
37800 20 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e   ** pCur is poin
37810 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 65 61 66  ting to the leaf
37820 20 70 61 67 65 20 66 72 6f 6d 20 77 68 69 63 68   page from which
37830 20 61 20 63 65 6c 6c 20 77 61 73 20 72 65 6d 6f   a cell was remo
37840 76 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65 70 6c  ved to.  ** repl
37850 61 63 65 20 74 68 65 20 63 65 6c 6c 20 64 65 6c  ace the cell del
37860 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  eted from the in
37870 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 69  ternal node. Thi
37880 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
37890 2a 2a 20 74 72 69 63 6b 79 20 61 73 20 74 68 65  ** tricky as the
378a0 20 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79 20 62   leaf node may b
378b0 65 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61 6e 64  e underfull, and
378c0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
378d0 64 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 65  de may.  ** be e
378e0 69 74 68 65 72 20 75 6e 64 65 72 20 6f 72 20 6f  ither under or o
378f0 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
37900 20 63 61 73 65 20 72 75 6e 20 74 68 65 20 62 61   case run the ba
37910 6c 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69 74 68  lancing algorith
37920 6d 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  m.  ** on the le
37930 61 66 20 6e 6f 64 65 20 66 69 72 73 74 2e 20 49  af node first. I
37940 66 20 74 68 65 20 62 61 6c 61 6e 63 65 20 70 72  f the balance pr
37950 6f 63 65 65 64 73 20 66 61 72 20 65 6e 6f 75 67  oceeds far enoug
37960 68 20 75 70 20 74 68 65 0a 20 20 2a 2a 20 74 72  h up the.  ** tr
37970 65 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 62  ee that we can b
37980 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20  e sure that any 
37990 70 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65 20 69  problem in the i
379a0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73  nternal node has
379b0 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72 72 65  .  ** been corre
379c0 63 74 65 64 2c 20 73 6f 20 62 65 20 69 74 2e 20  cted, so be it. 
379d0 4f 74 68 65 72 77 69 73 65 2c 20 61 66 74 65 72  Otherwise, after
379e0 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 6c   balancing the l
379f0 65 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77  eaf node,.  ** w
37a00 61 6c 6b 20 74 68 65 20 63 75 72 73 6f 72 20 75  alk the cursor u
37a10 70 20 74 68 65 20 74 72 65 65 20 74 6f 20 74 68  p the tree to th
37a20 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
37a30 61 6e 64 20 62 61 6c 61 6e 63 65 20 69 74 20 61  and balance it a
37a40 73 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a  s .  ** well.  *
37a50 2f 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  /.  rc = balance
37a60 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
37a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
37a80 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
37a90 44 65 70 74 68 20 29 7b 0a 20 20 20 20 77 68 69  Depth ){.    whi
37aa0 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  le( pCur->iPage>
37ab0 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20  iCellDepth ){.  
37ac0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37ad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
37ae0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
37af0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 61 6c    }.    rc = bal
37b00 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  ance(pCur);.  }.
37b10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
37b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
37b30 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
37b40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
37b50 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
37b60 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
37b70 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
37b80 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
37b90 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
37ba0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
37bb0 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
37bc0 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
37bd0 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
37be0 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
37bf0 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
37c00 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
37c10 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
37c20 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
37c30 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
37c40 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
37c50 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
37c60 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
37c70 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
37c80 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
37c90 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
37ca0 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
37cb0 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
37cc0 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
37cd0 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
37ce0 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
37cf0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
37d00 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
37d10 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
37d20 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
37d30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
37d40 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
37d50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
37d60 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
37d70 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
37d80 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
37d90 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
37da0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
37db0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
37dc0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
37dd0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
37de0 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
37df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
37e00 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
37e10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
37e20 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
37e30 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
37e40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
37e50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
37e60 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
37e70 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
37e80 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
37e90 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
37ea0 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
37eb0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
37ec0 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
37ed0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
37ee0 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
37ef0 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
37f00 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
37f10 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
37f20 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
37f30 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
37f40 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
37f50 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
37f60 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
37f70 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
37f80 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
37f90 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
37fa0 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
37fb0 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
37fc0 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
37fd0 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
37fe0 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
37ff0 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
38000 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
38010 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
38020 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
38030 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
38040 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
38050 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
38060 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
38070 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
38080 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
38090 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
380a0 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
380b0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
380c0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
380d0 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
380e0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
380f0 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
38100 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
38110 65 65 47 65 74 4d 65 74 61 28 70 2c 20 42 54 52  eeGetMeta(p, BTR
38120 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f 54 5f  EE_LARGEST_ROOT_
38130 50 41 47 45 2c 20 26 70 67 6e 6f 52 6f 6f 74 29  PAGE, &pgnoRoot)
38140 3b 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  ;.    pgnoRoot++
38150 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
38160 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
38170 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
38180 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
38190 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
381a0 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
381b0 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
381c0 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52      while( pgnoR
381d0 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  oot==PTRMAP_PAGE
381e0 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  NO(pBt, pgnoRoot
381f0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e  ) ||.        pgn
38200 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  oRoot==PENDING_B
38210 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
38220 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  .      pgnoRoot+
38230 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
38240 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33  ert( pgnoRoot>=3
38250 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   );..    /* Allo
38260 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65  cate a page. The
38270 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65   page that curre
38280 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20  ntly resides at 
38290 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20  pgnoRoot will.  
382a0 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f    ** be moved to
382b0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
382c0 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20  age (unless the 
382d0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
382e0 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f  appens.    ** to
382f0 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52   reside at pgnoR
38300 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oot)..    */.   
38310 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
38320 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50  reePage(pBt, &pP
38330 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f  ageMove, &pgnoMo
38340 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ve, pgnoRoot, 1)
38350 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
38360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
38370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
38380 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d  }..    if( pgnoM
38390 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b  ove!=pgnoRoot ){
383a0 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f  .      /* pgnoRo
383b0 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ot is the page t
383c0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
383d0 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
383e0 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ge of.      ** t
383f0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73  he new table (as
38400 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  suming an error 
38410 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20  did not occur). 
38420 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20  But we were.    
38430 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
38440 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75  gnoMove. If requ
38450 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74  ired (i.e. if it
38460 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74   was not allocat
38470 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65  ed.      ** by e
38480 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c  xtending the fil
38490 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  e), the current 
384a0 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e  page at position
384b0 20 70 67 6e 6f 4d 6f