/ Hex Artifact Content
Login

Artifact 812c365f76ec4cf5965e1920f40505debc1ef4e9:


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 37 30 34 20 32 30 30 39 2f 30  c,v 1.704 2009/0
0190: 38 2f 30 38 20 31 38 3a 30 31 3a 30 38 20 64 72  8/08 18:01:08 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 0a 2a 2a  ing modified..**
3800: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
3810: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3820: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65  true, then the e
3830: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
3840: 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69  f the.** table i
3850: 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  s about to be de
3860: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
3870: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ase invalidate a
3880: 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63  ll incrblob.** c
3890: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61  ursors open on a
38a0: 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68  ny row within th
38b0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
38c0: 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e  t-page pgnoRoot.
38d0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
38e0: 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73  , if argument is
38f0: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61  ClearTable is fa
3900: 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  lse, then the ro
3910: 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20  w with.** rowid 
3920: 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65  iRow is being re
3930: 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65  placed or delete
3940: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
3950: 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e  invalidate.** on
3960: 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f  ly those incrblo
3970: 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
3980: 6e 20 74 68 69 73 20 73 70 65 63 69 66 69 63 20  n this specific 
3990: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  row..*/.static v
39a0: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  oid invalidateIn
39b0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20  crblobCursors(. 
39c0: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
39d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
39e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
39f0: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20   check */.  i64 
3a00: 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20  iRow,           
3a10: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
3a20: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
3a30: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  hanging */.  int
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20   isClearTable   
3a50: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3a60: 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69  all rows are bei
3a70: 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b  ng deleted */.){
3a80: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3a90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3aa0: 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20  = pBtree->pBt;. 
3ab0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3ac0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
3ad0: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72  pBtree) );.  for
3ae0: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
3af0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3b00: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
3b10: 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
3b20: 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c  (isClearTable ||
3b30: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
3b40: 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70 2d  Row) ){.      p-
3b50: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
3b60: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a  _INVALID;.    }.
3b70: 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 23    }.}..#else.  #
3b80: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3b90: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  eOverflowCache(x
3ba0: 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  ).  #define inva
3bb0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
3bc0: 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66  wCache(x).  #def
3bd0: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  ine invalidateIn
3be0: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c  crblobCursors(x,
3bf0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
3c00: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
3c10: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
3c20: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3c30: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
3c40: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
3c50: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
3c60: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
3c70: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
3c80: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
3c90: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
3ca0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3cb0: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
3cc0: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
3cd0: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
3ce0: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
3cf0: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
3d00: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
3d10: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
3d20: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
3d30: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
3d40: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
3d50: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
3d60: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
3d70: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
3d80: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
3d90: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
3da0: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
3db0: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
3dc0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
3dd0: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
3de0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
3df0: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
3e00: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
3e10: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
3e20: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
3e30: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
3e40: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
3e50: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
3e60: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
3e70: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
3e80: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
3e90: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
3ea0: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
3eb0: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
3ec0: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
3ed0: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
3ee0: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
3ef0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
3f00: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
3f10: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
3f20: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
3f30: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
3f40: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
3f50: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
3f60: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
3f70: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
3f80: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
3f90: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
3fa0: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
3fb0: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
3fc0: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
3fd0: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
3fe0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
3ff0: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4000: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4010: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4020: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4030: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
4040: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
4050: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
4060: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
4070: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
4080: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4090: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
40a0: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
40b0: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
40c0: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
40d0: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
40e0: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
40f0: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4100: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4110: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4120: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4130: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
4140: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
4150: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
4160: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
4170: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
4180: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4190: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
41a0: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
41b0: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
41c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
41d0: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
41e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
41f0: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4200: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4210: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4220: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4230: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
4240: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
4250: 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74 65 64 20  ove is ommitted 
4260: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4270: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4280: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4290: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
42a0: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
42b0: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
42c0: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
42d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
42e0: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
42f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4300: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
4310: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4320: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
4330: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4340: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4350: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4360: 69 6e 74 20 6e 50 61 67 65 20 3d 20 31 30 30 3b  int nPage = 100;
4370: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
4380: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
4390: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
43a0: 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74  .    /* If sqlit
43b0: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
43c0: 28 29 20 66 61 69 6c 73 20 74 68 65 72 65 20 69  () fails there i
43d0: 73 20 6e 6f 20 68 61 72 6d 20 62 65 63 61 75 73  s no harm becaus
43e0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 50 61  e the.    ** nPa
43f0: 67 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ge variable is u
4400: 6e 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 74  nchanged from it
4410: 73 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  s default value 
4420: 6f 66 20 31 30 30 20 2a 2f 0a 20 20 20 20 70 42  of 100 */.    pB
4430: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
4440: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
4450: 65 61 74 65 28 28 75 33 32 29 6e 50 61 67 65 29  eate((u32)nPage)
4460: 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e  ;.    if( !pBt->
4470: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4480: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4490: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
44a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
44b0: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
44c0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
44d0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
44e0: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
44f0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
4500: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4510: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
4520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4530: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
4540: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4550: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
4560: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4570: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
4580: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4590: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
45a0: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
45b0: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
45c0: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
45d0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
45e0: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
45f0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
4600: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
4610: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
4620: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
4630: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4640: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
4650: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4660: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4670: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
4680: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
4690: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
46a0: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
46b0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
46c0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
46d0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
46e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
46f0: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
4700: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4710: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4720: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
4730: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
4740: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
4750: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4760: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4770: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
4780: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4790: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
47a0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
47b0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
47c0: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
47d0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
47e0: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
47f0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
4800: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
4810: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
4820: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
4830: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
4840: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
4850: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
4860: 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20  UIRESEEK..**.** 
4870: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
4880: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
4890: 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20  cursor is valid 
48a0: 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52  (has eState==CUR
48b0: 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72  SOR_VALID).** pr
48c0: 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
48d0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a  his routine.  .*
48e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
48f0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4900: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
4910: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4920: 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
4930: 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
4940: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
4950: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
4960: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
4970: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
4980: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
4990: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
49a0: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
49b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
49c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f  =SQLITE_OK );  /
49d0: 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e  * KeySize() cann
49e0: 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a  ot fail */..  /*
49f0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
4a00: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
4a10: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
4a20: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
4a30: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
4a40: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
4a50: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
4a60: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
4a70: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
4a80: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
4a90: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
4aa0: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
4ab0: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
4ac0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
4ad0: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
4ae0: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
4af0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
4b00: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
4b10: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  ta..  */.  if( 0
4b20: 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ==pCur->apPage[0
4b30: 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
4b40: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71   void *pKey = sq
4b50: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e  lite3Malloc( (in
4b60: 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  t)pCur->nKey );.
4b70: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
4b80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4b90: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
4ba0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
4bb0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
4bc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4bd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
4be0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
4bf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
4c10: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
4c20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
4c30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4c40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4c50: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
4c60: 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
4c70: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
4c80: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
4c90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4ca0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
4cb0: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4cc0: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4cd0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
4ce0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
4cf0: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61        pCur->apPa
4d00: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
4d10: 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
4d20: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d   = -1;.    pCur-
4d30: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
4d40: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
4d50: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
4d60: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
4d70: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
4d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
4d90: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
4da0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
4db0: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
4dc0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
4dd0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
4de0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
4df0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
4e00: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
4e10: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
4e20: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
4e30: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
4e40: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
4e50: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
4e60: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
4e70: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
4e80: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
4e90: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
4ea0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
4eb0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
4ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4ed0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
4ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
4ef0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
4f00: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
4f10: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4f20: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4f30: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
4f40: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
4f50: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
4f60: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
4f70: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4f80: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
4f90: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
4fa0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
4fb0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
4fc0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
4fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4fe0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4ff0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5000: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5010: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5020: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5030: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5040: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5050: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5060: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
5070: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5080: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5090: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
50a0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
50b0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
50c0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
50d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
50e0: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
50f0: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
5100: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
5110: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5120: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5130: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5140: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5150: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5160: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
5170: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
5180: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5190: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
51a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
51b0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
51c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
51d0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
51e0: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
51f0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5200: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
5210: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5220: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5230: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5240: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5250: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5260: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
5270: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
5280: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
5290: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
52a0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
52b0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
52c0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
52d0: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
52e0: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
52f0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
5300: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5320: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5330: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5340: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5350: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5360: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
5370: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
5380: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
5390: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
53a0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
53b0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
53c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
53d0: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
53e0: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
53f0: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
5400: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5410: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5420: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20  t)nKey, pKey,.  
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65      aSpace, size
5460: 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20  of(aSpace));.   
5470: 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
5480: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5490: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
54a0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
54b0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
54c0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
54d0: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
54e0: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
54f0: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5500: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
5510: 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
5520: 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b  ckedRecord(pIdxK
5530: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
5540: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5550: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
5560: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
5570: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
5580: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
5590: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
55a0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
55b0: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
55c0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
55d0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
55e0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
55f0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
5600: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
5610: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
5620: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
5630: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
5640: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
5650: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
5660: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
5670: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5680: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
5690: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
56a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
56b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
56c0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
56d0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
56e0: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
56f0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
5700: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
5710: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
5720: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5730: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
5740: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
5750: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  skipNext;.  }.  
5760: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5770: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
5780: 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74   rc = btreeMovet
5790: 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b  o(pCur, pCur->pK
57a0: 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  ey, pCur->nKey, 
57b0: 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65  0, &pCur->skipNe
57c0: 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  xt);.  if( rc==S
57d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
57e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
57f0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
5800: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
5810: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
5820: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
5830: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
5840: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
5850: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
5860: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
5870: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
5880: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
5890: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
58a0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
58b0: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
58c0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
58d0: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
58e0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
58f0: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
5900: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
5910: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
5920: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
5930: 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61  osition it.** wa
5940: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74  s last placed at
5950: 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d  .  Cursors can m
5960: 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77  ove when the row
5970: 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69   they are pointi
5980: 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65  ng.** at is dele
5990: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
59a0: 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  er them..**.** T
59b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
59c0: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rns an error cod
59d0: 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  e if something g
59e0: 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a  oes wrong.  The.
59f0: 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73  ** integer *pHas
5a00: 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20  Moved is set to 
5a10: 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  one if the curso
5a20: 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20  r has moved and 
5a30: 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74  0 if not..*/.int
5a40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
5a50: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
5a60: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
5a70: 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69  *pHasMoved){.  i
5a80: 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  nt rc;..  rc = r
5a90: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5aa0: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
5ab0: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61  ( rc ){.    *pHa
5ac0: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  sMoved = 1;.    
5ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
5ae0: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
5af0: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
5b00: 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  || pCur->skipNex
5b10: 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61  t!=0 ){.    *pHa
5b20: 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65  sMoved = 1;.  }e
5b30: 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  lse{.    *pHasMo
5b40: 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ved = 0;.  }.  r
5b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5b60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
5b70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
5b80: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
5b90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
5ba0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
5bb0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
5bc0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
5bd0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
5be0: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
5bf0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
5c00: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
5c10: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
5c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
5c30: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
5c40: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5c50: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
5c60: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
5c70: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
5c80: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
5c90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5ca0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5cb0: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
5cc0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
5cd0: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
5ce0: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
5cf0: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
5d00: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
5d10: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
5d20: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
5d30: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
5d40: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
5d50: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
5d60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
5d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
5d80: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
5d90: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
5da0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5db0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
5dc0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
5dd0: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
5de0: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
5df0: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
5e00: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
5e10: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
5e20: 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pgno'..**.** If 
5e30: 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c  *pRC is initiall
5e40: 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d  y non-zero (non-
5e50: 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20  SQLITE_OK) then 
5e60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
5e70: 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  ** a no-op.  If 
5e80: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
5e90: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
5ea0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77   error code is w
5eb0: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
5ec0: 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pRC..*/.static v
5ed0: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74  oid ptrmapPut(Bt
5ee0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5ef0: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
5f00: 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e   Pgno parent, in
5f10: 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67  t *pRC){.  DbPag
5f20: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
5f30: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
5f40: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
5f50: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
5f60: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
5f70: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
5f80: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
5f90: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
5fa0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
5fb0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
5fc0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
5fd0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
5fe0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
5ff0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6000: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
6010: 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
6020: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
6030: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6040: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6050: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
6060: 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  * The master-jou
6070: 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  rnal page number
6080: 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75   must never be u
6090: 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
60a0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61   map page */.  a
60b0: 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50  ssert( 0==PTRMAP
60c0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e  _ISPAGE(pBt, PEN
60d0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
60e0: 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  Bt)) );..  asser
60f0: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
6100: 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d  um );.  if( key=
6110: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  =0 ){.    *pRC =
6120: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6130: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
6140: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
6150: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
6160: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
6170: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
6180: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
6190: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
61a0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
61b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
61c0: 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
61d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  urn;.  }.  offse
61e0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
61f0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
6200: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
6210: 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  <0 ){.    *pRC =
6220: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6230: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
6240: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
6250: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
6260: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
6270: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
6280: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
6290: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
62a0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
62b0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
62c0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
62d0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
62e0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
62f0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
6300: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
6310: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
6320: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
6330: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
6340: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6350: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
6360: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
6370: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
6380: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
6390: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
63a0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
63b0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
63c0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
63d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
63e0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
63f0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
6400: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
6410: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
6420: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
6430: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
6440: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
6450: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
6460: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
6470: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
6480: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
6490: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
64a0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
64b0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
64c0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
64d0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
64e0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
64f0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6500: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
6510: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
6520: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
6530: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
6540: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
6550: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
6560: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
6570: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
6580: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
6590: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
65a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
65b0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
65c0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
65d0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
65e0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
65f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
6600: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6610: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6620: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
6630: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6640: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6650: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6660: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6670: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6680: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6690: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
66a0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
66b0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
66c0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
66d0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
66e0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
66f0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
6700: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
6710: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
6720: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
6730: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
6740: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
6750: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
6760: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
6770: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6780: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
6790: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
67a0: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
67b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
67c0: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
67d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
67e0: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
67f0: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
6800: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
6810: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
6820: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
6830: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
6840: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
6850: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
6860: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
6870: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
6880: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
6890: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
68a0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
68b0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
68c0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
68d0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
68e0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
68f0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
6900: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
6910: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
6920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6930: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
6940: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
6950: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
6960: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
6970: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
6980: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
6990: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
69a0: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
69b0: 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28  te(&(P)->aData[(
69c0: 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  P)->cellOffset+2
69d0: 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  *(I)])))../*.** 
69e0: 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70  This a more comp
69f0: 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  lex version of f
6a00: 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77  indCell() that w
6a10: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65  orks for.** page
6a20: 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69  s that do contai
6a30: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
6a40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
6a50: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
6a60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
6a70: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
6a80: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
6a90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6aa0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6ab0: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
6ac0: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
6ad0: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
6ae0: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
6af0: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
6b00: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
6b10: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
6b20: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
6b30: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
6b40: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
6b50: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
6b60: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
6b70: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
6b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6b90: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
6ba0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
6bb0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
6bc0: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
6bd0: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
6be0: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
6bf0: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
6c00: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
6c10: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
6c20: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
6c30: 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50  unction.  btreeP
6c40: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
6c50: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
6c60: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
6c70: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72  argument and btr
6c80: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
6c90: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
6ca0: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
6cb0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
6cc0: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
6cd0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
6ce0: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
6cf0: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
6d00: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
6d10: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
6d20: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
6d30: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
6d40: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
6d50: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
6d60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
6d70: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6d80: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
6d90: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
6da0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
6db0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
6dc0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
6dd0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
6de0: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
6df0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
6e00: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
6e10: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
6e20: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
6e30: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
6e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6e50: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
6e60: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
6e70: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
6e80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
6e90: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
6ea0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
6eb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
6ec0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6ed0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
6ee0: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
6ef0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
6f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6f10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
6f20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
6f30: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
6f40: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
6f50: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
6f60: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
6f70: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
6f80: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
6f90: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e  sData ){.      n
6fa0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
6fb0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
6fc0: 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oad);.    }else{
6fd0: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
6fe0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
6ff0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
7000: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26  Cell[n], (u64*)&
7010: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
7020: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7030: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c   nPayload;.  }el
7040: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
7050: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20  Data = 0;.    n 
7060: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
7070: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
7080: 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ad);.    pInfo->
7090: 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  nKey = nPayload;
70a0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  .  }.  pInfo->nP
70b0: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
70c0: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  d;.  pInfo->nHea
70d0: 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63  der = n;.  testc
70e0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
70f0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7100: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
7110: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
7120: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
7130: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
7140: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
7150: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
7160: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
7170: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
7180: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
7190: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
71a0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
71b0: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
71c0: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
71d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
71e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
71f0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
7200: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
7210: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69  bytes */.    nSi
7220: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
7230: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  n;.    pInfo->nL
7240: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
7250: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
7260: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
7270: 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26      if( (nSize &
7280: 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   ~3)==0 ){.     
7290: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
72a0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
72b0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
72c0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
72d0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53  >nSize = (u16)nS
72e0: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
72f0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
7300: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
7310: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
7320: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
7330: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
7340: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
7350: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
7360: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
7370: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
7380: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
7390: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
73a0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
73b0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
73c0: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
73d0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
73e0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
73f0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
7400: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
7410: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
7420: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
7430: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
7440: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
7450: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
7460: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
7470: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
7480: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
7490: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
74a0: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
74b0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
74c0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
74d0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
74e0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
74f0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7500: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
7510: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
7520: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7530: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7540: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
7550: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
7560: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
7570: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
7580: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
7590: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
75a0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
75b0: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
75c0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
75d0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
75e0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
75f0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
7600: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7610: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7620: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
7630: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  =maxLocal );.   
7640: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7650: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
7660: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
7670: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
7680: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7690: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
76a0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
76b0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
76c0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
76d0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
76e0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
76f0: 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e  = (u16)(pInfo->n
7700: 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20  Local + n);.    
7710: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
7720: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7730: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
7740: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
7750: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7760: 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65  ) \.  btreeParse
7770: 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c  CellPtr((pPage),
7780: 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65   findCell((pPage
7790: 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49  ), (iCell)), (pI
77a0: 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69  nfo)).static voi
77b0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
77c0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
77d0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
77e0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
77f0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
7800: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
7810: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
7820: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
7830: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
7840: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
7850: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
7860: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7870: 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c  */.){.  parseCel
7880: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
7890: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
78a0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
78b0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
78c0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
78d0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
78e0: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
78f0: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
7900: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
7910: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
7920: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
7930: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
7940: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
7950: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
7960: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
7970: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
7980: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
7990: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
79a0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
79b0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
79c0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
79d0: 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65  r = &pCell[pPage
79e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
79f0: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23  .  u32 nSize;..#
7a00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
7a10: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
7a20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7a30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7a40: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
7a50: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
7a60: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
7a70: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
7a80: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
7a90: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
7aa0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
7ab0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
7ac0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
7ad0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
7ae0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
7af0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
7b00: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
7b10: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
7b20: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
7b30: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65  ebuginfo;.  btre
7b40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
7b50: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
7b60: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
7b70: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
7b80: 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a  tKey ){.    u8 *
7b90: 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50  pEnd;.    if( pP
7ba0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
7bb0: 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67        pIter += g
7bc0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7bd0: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  , nSize);.    }e
7be0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  lse{.      nSize
7bf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
7c00: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
7c10: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
7c20: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
7c30: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
7c40: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
7c50: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
7c60: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
7c70: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
7c80: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
7c90: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
7ca0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
7cb0: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
7cc0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
7cd0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
7ce0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
7cf0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
7d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
7d10: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
7d20: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
7d30: 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28    }..  testcase(
7d40: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7d50: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
7d60: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
7d70: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7d80: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  );.  if( nSize>p
7d90: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7da0: 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  {.    int minLoc
7db0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
7dc0: 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20  ocal;.    nSize 
7dd0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53  = minLocal + (nS
7de0: 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20  ize - minLocal) 
7df0: 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
7e00: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7e10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
7e20: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
7e30: 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
7e40: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7e50: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
7e60: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
7e70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7e80: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
7e90: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
7ea0: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b  .    nSize += 4;
7eb0: 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20  .  }.  nSize += 
7ec0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
7ed0: 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ell);..  /* The 
7ee0: 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  minimum size of 
7ef0: 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79  any cell is 4 by
7f00: 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53  tes. */.  if( nS
7f10: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69  ize<4 ){.    nSi
7f20: 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61  ze = 4;.  }..  a
7f30: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
7f40: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  buginfo.nSize );
7f50: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
7f60: 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20  Size;.}.#ifndef 
7f70: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31  NDEBUG.static u1
7f80: 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61  6 cellSize(MemPa
7f90: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7fa0: 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  Cell){.  return 
7fb0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
7fc0: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
7fd0: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
7fe0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
7ff0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8000: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
8010: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
8020: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
8030: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
8040: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
8050: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
8060: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
8070: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
8080: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
8090: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
80a0: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
80b0: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
80c0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
80d0: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
80e0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
80f0: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
8100: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
8110: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62   pCell!=0 );.  b
8120: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8130: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8140: 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
8150: 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
8160: 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
8170: 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
8180: 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66  nPayload );.  if
8190: 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
81a0: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
81b0: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
81c0: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
81d0: 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  ow]);.    ptrmap
81e0: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
81f0: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
8200: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
8210: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
8220: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
8230: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
8240: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
8250: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
8260: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
8270: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
8280: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
8290: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
82a0: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
82b0: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
82c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
82d0: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
82e0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
82f0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
8300: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
8310: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
8320: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
8330: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8360: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
8390: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
83a0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
83c0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
83d0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
83e0: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
83f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
8400: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
8410: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
8420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8430: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
8440: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
8450: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
8460: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
8470: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8480: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
8490: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
84a0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
84b0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
84c0: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
84d0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
84e0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
84f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8500: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
8510: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
8520: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
8530: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
8540: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
8550: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
8560: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
8570: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
8580: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntent */.  int i
8590: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20  CellFirst;      
85a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
85b0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e  llowable cell in
85c0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  dex */.  int iCe
85d0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20  llLast;         
85e0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
85f0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
8600: 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73  */...  assert( s
8610: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
8620: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
8630: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
8640: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
8650: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
8660: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8670: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
8680: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
8690: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
86a0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
86b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
86c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
86d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
86e0: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71  ) );.  temp = sq
86f0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
8700: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
8710: 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20  pPager);.  data 
8720: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
8730: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
8740: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
8750: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
8760: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
8770: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
8780: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
8790: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
87a0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
87b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
87c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
87d0: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67  Size;.  cbrk = g
87e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
87f0: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
8800: 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61  &temp[cbrk], &da
8810: 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ta[cbrk], usable
8820: 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20  Size - cbrk);.  
8830: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
8840: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
8850: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
8860: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
8870: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
8880: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
8890: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
88a0: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
88b0: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
88c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
88d0: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
88e0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
88f0: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
8900: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
8910: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
8920: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8930: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
8940: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66  iCellLast );.#if
8950: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8960: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
8970: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
8980: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
8990: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
89a0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
89b0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
89c0: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c  ().    ** if SQL
89d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
89e0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69  IZE_CELL_CHECK i
89f0: 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a  s defined .    *
8a00: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
8a10: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
8a20: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
8a30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8a40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8a50: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
8a60: 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46  sert( pc>=iCellF
8a70: 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c  irst && pc<=iCel
8a80: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a  lLast );.    siz
8a90: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  e = cellSizePtr(
8aa0: 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d  pPage, &temp[pc]
8ab0: 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73  );.    cbrk -= s
8ac0: 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ize;.#if defined
8ad0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
8ae0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
8af0: 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b  CK).    if( cbrk
8b00: 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
8b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8b20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8b30: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
8b40: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
8b50: 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  irst || pc+size>
8b60: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
8b70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8b80: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8b90: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8ba0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
8bb0: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
8bc0: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
8bd0: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
8be0: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
8bf0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
8c00: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
8c10: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8c20: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
8c30: 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b  ta[cbrk], &temp[
8c40: 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20  pc], size);.    
8c50: 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20  put2byte(pAddr, 
8c60: 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73  cbrk);.  }.  ass
8c70: 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  ert( cbrk>=iCell
8c80: 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62  First );.  put2b
8c90: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8ca0: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
8cb0: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
8cc0: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
8cd0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
8ce0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
8cf0: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
8d00: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
8d10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8d20: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8d30: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8d40: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62  age) );.  if( cb
8d50: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
8d60: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
8d70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8d80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8d90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8da0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8db0: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
8dc0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
8dd0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
8de0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
8df0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
8e00: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
8e10: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
8e20: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
8e30: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
8e40: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
8e50: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
8e60: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
8e70: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
8e80: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
8e90: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
8ea0: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
8eb0: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
8ec0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
8ed0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
8ee0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
8ef0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
8f00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
8f10: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
8f20: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
8f30: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
8f40: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
8f50: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
8f60: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
8f70: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
8f80: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
8f90: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
8fa0: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
8fb0: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
8fc0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
8fd0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
8fe0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
8ff0: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
9000: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
9010: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
9020: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
9030: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
9040: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
9050: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9060: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
9070: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
9080: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
9090: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
90a0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
90b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
90c0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
90d0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
90e0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
90f0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9100: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
9110: 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20  nt nFrag;       
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9140: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
9150: 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  s on pPage */.  
9160: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
9190: 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  te of cell conte
91a0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
91b0: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
91c0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
91d0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
91e0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
91f0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
9200: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
9210: 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20   Integer return 
9220: 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73  code */.  .  ass
9230: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9240: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9250: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9260: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9270: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
9280: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9290: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
92a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
92b0: 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b  ert( nByte>=0 );
92c0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
92d0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
92e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
92f0: 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a  nFree>=nByte );.
9300: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9310: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9320: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9330: 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
9340: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
9350: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
9360: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
9370: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9380: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9390: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
93a0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
93b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
93c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
93d0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
93e0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
93f0: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
9400: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9410: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
9420: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
9430: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9440: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
9450: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
9460: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
9470: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
9480: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
9490: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
94a0: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
94b0: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
94c0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
94d0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
94e0: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
94f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9500: 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  +5]);.  }else if
9510: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  ( gap+2<=top ){.
9520: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
9530: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
9540: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
9550: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
9560: 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a   satisfy .    **
9570: 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68   the request. Th
9580: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
9590: 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69  made from the fi
95a0: 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  rst free slot in
95b0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73   .    ** the lis
95c0: 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20  t that is large 
95d0: 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61  enough to accoma
95e0: 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  date it..    */.
95f0: 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72      int pc, addr
9600: 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68  ;.    for(addr=h
9610: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
9620: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
9630: 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a  ))>0; addr=pc){.
9640: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d        int size =
9650: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9660: 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53  pc+2]);     /* S
9670: 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74  ize of free slot
9680: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69   */.      if( si
9690: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
96a0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a       int x = siz
96b0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
96c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
96d0: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4 );.        tes
96e0: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
96f0: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
9700: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  {.          /* R
9710: 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66  emove the slot f
9720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
9730: 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75  t. Update the nu
9740: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
9750: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
9760: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
9770: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
9780: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
9790: 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63  [addr], &data[pc
97a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 2);.         
97b0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28   data[hdr+7] = (
97c0: 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a  u8)(nFrag + x);.
97d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
97e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
97f0: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
9800: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
9810: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
9820: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
9830: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
9840: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
9850: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
9860: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n. */.          
9870: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
9880: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
9890: 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64    }.        *pId
98a0: 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20  x = pc + x;.    
98b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
98c0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
98d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
98e0: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
98f0: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
9900: 20 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61   space in the ga
9910: 70 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a  p to satisfy.  *
9920: 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  * the allocation
9930: 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61  .  If not, defra
9940: 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  gment..  */.  te
9950: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
9960: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
9970: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
9980: 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65  p ){.    rc = de
9990: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
99a0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
99b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
99c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
99d0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
99e0: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e     assert( gap+n
99f0: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
9a00: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
9a10: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
9a20: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
9a30: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9a40: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
9a50: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
9a60: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
9a70: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
9a80: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
9a90: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
9aa0: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
9ab0: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
9ac0: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
9ad0: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
9ae0: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
9af0: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
9b00: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
9b10: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
9b20: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
9b30: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
9b40: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
9b50: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
9b60: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
9b70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9b80: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
9b90: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61  top+nByte <= pPa
9ba0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9bb0: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
9bc0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
9bd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9be0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
9bf0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
9c00: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
9c10: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
9c20: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
9c30: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
9c40: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b   is pPage->aDisk
9c50: 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  [start].** and t
9c60: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
9c70: 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62  lock is "size" b
9c80: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74  ytes..**.** Most
9c90: 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68   of the effort h
9ca0: 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  ere is involved 
9cb0: 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a  in coalesing adj
9cc0: 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c  acent.** free bl
9cd0: 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ocks into a sing
9ce0: 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63  le big free bloc
9cf0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
9d00: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
9d10: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73  ge *pPage, int s
9d20: 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b  tart, int size){
9d30: 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65  .  int addr, pbe
9d40: 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20  gin, hdr;.  int 
9d50: 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  iLast;          
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d70: 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c   Largest possibl
9d80: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  e freeblock offs
9d90: 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  et */.  unsigned
9da0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
9db0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61  age->aData;..  a
9dc0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9dd0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
9de0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9df0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9e00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9e10: 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50  ssert( start>=pP
9e20: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
9e30: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
9e40: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
9e50: 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29  ( (start + size)
9e60: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
9e70: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
9e80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9e90: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9ea0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9eb0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30   assert( size>=0
9ec0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
9ed0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
9ee0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
9ef0: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
9f00: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
9f10: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
9f20: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
9f30: 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44 45  en the SECURE_DE
9f40: 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f  LETE .  ** optio
9f50: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20  n is enabled at 
9f60: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a  compile-time */.
9f70: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73    memset(&data[s
9f80: 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b  tart], 0, size);
9f90: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
9fa0: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
9fb0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
9fc0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
9fd0: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
9fe0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
9ff0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a000: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a010: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a020: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a030: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a040: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a050: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a060: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a070: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a080: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a090: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a0a0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a0b0: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a0c0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a0d0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a0e0: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a0f0: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a100: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a110: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a120: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a130: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a140: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a150: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a160: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a170: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a180: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a190: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a1a0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a1b0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a1c0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a1d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a1e0: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a1f0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a200: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a210: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
a220: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
a230: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
a240: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
a250: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
a260: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a270: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
a280: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
a290: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
a2a0: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
a2b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a2c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a2d0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a2e0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
a2f0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
a300: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
a310: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
a320: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
a330: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
a340: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
a350: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
a360: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
a370: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
a380: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
a390: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
a3a0: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
a3b0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
a3c0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
a3d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a3e0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
a3f0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
a400: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
a410: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
a420: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
a430: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
a440: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
a450: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
a460: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
a470: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
a480: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a490: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
a4a0: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
a4b0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
a4c0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
a4d0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
a4e0: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
a4f0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
a500: 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61  (frag<0) || (fra
a510: 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b  g>(int)data[hdr+
a520: 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  7]) ){.        r
a530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a540: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
a550: 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64   }.      data[hd
a560: 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67  r+7] -= (u8)frag
a570: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
a580: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
a590: 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ]);.      put2by
a5a0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
a5b0: 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  , x);.      x = 
a5c0: 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65  pnext + get2byte
a5d0: 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29  (&data[pnext+2])
a5e0: 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20   - pbegin;.     
a5f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a600: 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20  pbegin+2], x);. 
a610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a620: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
a630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
a640: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
a650: 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77  nt area begins w
a660: 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c  ith a freeblock,
a670: 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   remove it. */. 
a680: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d   if( data[hdr+1]
a690: 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26  ==data[hdr+5] &&
a6a0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61   data[hdr+2]==da
a6b0: 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20  ta[hdr+6] ){.   
a6c0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62   int top;.    pb
a6d0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a6e0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
a6f0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
a700: 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62  hdr+1], &data[pb
a710: 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74  egin], 2);.    t
a720: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
a730: 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65  ata[hdr+5]) + ge
a740: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a750: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74  gin+2]);.    put
a760: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a770: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20  5], top);.  }.  
a780: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a790: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a7a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a7b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
a7c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a7d0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
a7e0: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
a7f0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
a800: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
a810: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
a820: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
a830: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
a840: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
a850: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
a860: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
a870: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
a880: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
a890: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
a8a0: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
a8b0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
a8c0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
a8d0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
a8e0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
a8f0: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
a900: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
a910: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
a920: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
a930: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
a940: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
a950: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
a960: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
a970: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a980: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
a990: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
a9a0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
a9b0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
a9c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
a9d0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
a9e0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
a9f0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
aa00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
aa10: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
aa20: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
aa30: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
aa40: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
aa50: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
aa60: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
aa70: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
aa80: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
aa90: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
aaa0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
aab0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
aac0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
aad0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
aae0: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
aaf0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
ab00: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
ab10: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
ab20: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
ab30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
ab40: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
ab50: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
ab60: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
ab70: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
ab80: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
ab90: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
aba0: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
abb0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
abc0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
abd0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
abe0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
abf0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
ac00: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
ac10: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
ac20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ac30: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
ac40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ac50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
ac60: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
ac70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
ac80: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
ac90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
aca0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
acb0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
acc0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
acd0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
ace0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
acf0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
ad00: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
ad10: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
ad20: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
ad30: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
ad40: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
ad50: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
ad60: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
ad70: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
ad80: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
ad90: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
ada0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
adb0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
adc0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
add0: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
ade0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
adf0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
ae00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ae10: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
ae20: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
ae30: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
ae40: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
ae50: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
ae60: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
ae70: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
ae80: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ae90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
aea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
aeb0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
aec0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
aed0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
aee0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
aef0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
af00: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
af10: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
af20: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
af30: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
af40: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
af50: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
af60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
af70: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
af80: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
af90: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
afa0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
afb0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
afc0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
afd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
afe0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
aff0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62   */.    u16 usab
b000: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
b010: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
b020: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b030: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
b040: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
b050: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
b060: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
b070: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
b080: 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b  /.    u16 nFree;
b090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b0a0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
b0b0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
b0c0: 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20  /.    u16 top;  
b0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b0e0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
b0f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b100: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
b110: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
b120: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b130: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
b140: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
b150: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b160: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
b170: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
b180: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
b190: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b1a0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
b1b0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
b1c0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
b1d0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
b1e0: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
b1f0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
b200: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b210: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b220: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
b230: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
b240: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
b250: 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67  2768 );.    pPag
b260: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
b270: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
b280: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
b290: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
b2a0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
b2b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
b2c0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b2d0: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
b2e0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
b2f0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b300: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
b310: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b320: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b330: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b340: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
b350: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
b360: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
b370: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
b380: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
b390: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
b3a0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
b3b0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
b3c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b3d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b3e0: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
b3f0: 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
b400: 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  (pBt) );..    /*
b410: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
b420: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
b430: 20 63 61 75 73 65 20 75 73 65 20 74 6f 20 72 65   cause use to re
b440: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
b450: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
b460: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
b470: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
b480: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
b490: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
b4a0: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
b4b0: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
b4c0: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
b4d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
b4e0: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
b4f0: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
b500: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
b510: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
b520: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
b530: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
b540: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b550: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
b560: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
b570: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
b580: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b590: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
b5a0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
b5b0: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b5d0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
b5e0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
b5f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
b600: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
b610: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
b620: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
b630: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
b640: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
b650: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
b660: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
b670: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
b680: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
b690: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
b6a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
b6b0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b6c0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
b6d0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
b6e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
b6f0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
b700: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
b710: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b720: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b730: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
b740: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
b750: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
b760: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
b770: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
b780: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
b790: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
b7a0: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
b7b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
b7c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b7d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
b7e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b7f0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
b800: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
b810: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
b820: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
b830: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
b840: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
b850: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
b860: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
b870: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
b880: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
b890: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
b8a0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
b8b0: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
b8c0: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
b8d0: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
b8e0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
b8f0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  * Free block is 
b900: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
b910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b930: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
b940: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
b950: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
b960: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
b970: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
b980: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78  );.      if( nex
b990: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
b9a0: 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20  size+3 ){.      
b9b0: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
b9c0: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
b9d0: 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
b9e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b9f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
ba00: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
ba10: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
ba20: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
ba30: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
ba40: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
ba50: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
ba60: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
ba70: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
ba80: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
ba90: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
baa0: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
bab0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
bac0: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
bad0: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
bae0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
baf0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
bb00: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
bb10: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
bb20: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
bb30: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
bb40: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
bb50: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
bb60: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
bb70: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
bb80: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
bb90: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bba0: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
bbb0: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
bbc0: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
bbd0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bbe0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
bbf0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
bc00: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
bc10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bc20: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
bc30: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
bc40: 20 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69   nFree - iCellFi
bc50: 72 73 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  rst;.    pPage->
bc60: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  isInit = 1;.  }.
bc70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
bc90: 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73   up a raw page s
bca0: 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20  o that it looks 
bcb0: 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20  like a database 
bcc0: 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20  page holding.** 
bcd0: 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  no entries..*/.s
bce0: 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50  tatic void zeroP
bcf0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
bd00: 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ge, int flags){.
bd10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bd20: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bd30: 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64  Data;.  BtShared
bd40: 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
bd50: 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70  Bt;.  u8 hdr = p
bd60: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
bd70: 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20  .  u16 first;.. 
bd80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bd90: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
bda0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
bdb0: 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  =pPage->pgno );.
bdc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bdd0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
bde0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
bdf0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
be00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
be10: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
be20: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
be30: 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73  == data );.  ass
be40: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
be50: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
be60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
be70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
be80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
be90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
bea0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
beb0: 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
bec0: 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a  eSize - hdr);*/.
bed0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
bee0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
bef0: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
bf00: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
bf10: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
bf20: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
bf30: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
bf40: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
bf50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
bf60: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
bf70: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
bf80: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
bf90: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
bfa0: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
bfb0: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
bfc0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
bfd0: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
bfe0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
bff0: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
c000: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
c010: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
c020: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
c030: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32  Bt->pageSize<=32
c040: 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  768 );.  pPage->
c050: 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e  maskPage = pBt->
c060: 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20  pageSize - 1;.  
c070: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
c080: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
c090: 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
c0a0: 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
c0b0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
c0c0: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
c0d0: 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
c0e0: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
c0f0: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
c100: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
c110: 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
c120: 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
c130: 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
c140: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
c150: 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
c160: 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
c170: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
c180: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
c190: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
c1a0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
c1b0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
c1c0: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
c1d0: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
c1e0: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
c1f0: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
c200: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
c210: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c220: 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
c230: 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
c240: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c250: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
c260: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c270: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c280: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c290: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c2a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
c2b0: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
c2c0: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
c2d0: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
c2e0: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
c2f0: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
c300: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
c310: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
c320: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
c330: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
c340: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
c350: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
c360: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
c370: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
c380: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
c390: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
c3a0: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
c3b0: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
c3c0: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
c3d0: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
c3e0: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
c3f0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
c400: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
c410: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
c420: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c430: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
c440: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
c450: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
c460: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
c470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c480: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
c490: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
c4a0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
c4b0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
c4c0: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
c4d0: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
c4e0: 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20  oContent        
c4f0: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70  /* Do not load p
c500: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74  age content if t
c510: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
c520: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
c530: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
c540: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c550: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
c560: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
c570: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
c580: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
c590: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
c5a0: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
c5b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
c5c0: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
c5d0: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
c5e0: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
c5f0: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
c600: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
c620: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
c630: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
c640: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
c650: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
c660: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
c670: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
c680: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
c690: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
c6a0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
c6b0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
c6c0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
c6d0: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
c6e0: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
c6f0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
c700: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
c710: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
c720: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c730: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
c740: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
c750: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
c760: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
c770: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
c780: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
c790: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
c7a0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c7b0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c7c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
c7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c7e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c7f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
c800: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
c810: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
c820: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
c830: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
c840: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
c850: 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f  Pgno pagerPageco
c860: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
c870: 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20  t){.  int nPage 
c880: 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  = -1;.  int rc;.
c890: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c8a0: 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20  Page1 );.  rc = 
c8b0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c8c0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
c8d0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73  r, &nPage);.  as
c8e0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
c8f0: 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31  _OK || nPage==-1
c900: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67   );.  return (Pg
c910: 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a  no)nPage;.}../*.
c920: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
c930: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
c940: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
c950: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c960: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
c970: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
c980: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
c990: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
c9a0: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
c9b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
c9c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c9d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
c9e0: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
c9f0: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
ca00: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
ca10: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
ca20: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
ca30: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
ca40: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
ca50: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
ca60: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
ca70: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ca80: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
ca90: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
caa0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
cab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
cac0: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
cad0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
cae0: 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74  Page     /* Writ
caf0: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
cb00: 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  er here */.){.  
cb10: 69 6e 74 20 72 63 3b 0a 20 20 54 45 53 54 4f 4e  int rc;.  TESTON
cb20: 4c 59 28 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  LY( Pgno iLastPg
cb30: 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
cb40: 74 28 70 42 74 29 3b 20 29 0a 20 20 61 73 73 65  t(pBt); ).  asse
cb50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cb60: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
cb70: 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 62 74  x) );..  rc = bt
cb80: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
cb90: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  pgno, ppPage, 0)
cba0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
cbb0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
cbc0: 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
cbd0: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  *ppPage);.    if
cbe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cbf0: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
cc00: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
cc10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
cc20: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
cc30: 70 61 67 65 20 6e 75 6d 62 65 72 20 77 61 73 20  page number was 
cc40: 65 69 74 68 65 72 20 30 20 6f 72 20 67 72 65 61  either 0 or grea
cc50: 74 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67  ter than the pag
cc60: 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  e.  ** number of
cc70: 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
cc80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
cc90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
cca0: 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a  ould return.  **
ccb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
ccc0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
ccd0: 72 6f 72 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ror (i.e. SQLITE
cce0: 5f 46 55 4c 4c 29 2e 20 43 68 65 63 6b 20 74 68  _FULL). Check th
ccf0: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  at this.  ** is 
cd00: 74 68 65 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  the case.  */.  
cd10: 61 73 73 65 72 74 28 20 28 70 67 6e 6f 3e 30 20  assert( (pgno>0 
cd20: 26 26 20 70 67 6e 6f 3c 3d 69 4c 61 73 74 50 67  && pgno<=iLastPg
cd30: 29 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  ) || rc!=SQLITE_
cd40: 4f 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  OK );.  testcase
cd50: 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 74  ( pgno==0 );.  t
cd60: 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 69  estcase( pgno==i
cd70: 4c 61 73 74 50 67 20 29 3b 0a 0a 20 20 72 65 74  LastPg );..  ret
cd80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cd90: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
cda0: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
cdb0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
cdc0: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
cdd0: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
cde0: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
cdf0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
ce00: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ce10: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
ce20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
ce30: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
ce40: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
ce50: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
ce60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3e 31  Page->pDbPage)>1
ce70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ce80: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
ce90: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cea0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
ceb0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cec0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
ced0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
cee0: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
cef0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cf00: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
cf10: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
cf20: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
cf30: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
cf40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
cf50: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
cf60: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
cf70: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
cf80: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
cf90: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
cfa0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
cfb0: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
cfc0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
cfd0: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
cfe0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
cff0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d000: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d010: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d020: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d030: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d040: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d050: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d060: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d070: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
d080: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
d090: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
d0a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d0b0: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
d0c0: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
d0d0: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
d0e0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
d0f0: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
d100: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
d110: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
d120: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
d130: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
d140: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
d150: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
d160: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
d170: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
d180: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d190: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d1a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d1b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d1c0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
d1d0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
d1e0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
d1f0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
d200: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
d210: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
d220: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
d230: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
d240: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
d250: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
d260: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
d270: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
d280: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
d290: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
d2a0: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
d2b0: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
d2c0: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
d2d0: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
d2e0: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
d2f0: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
d300: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
d310: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
d320: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
d330: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
d340: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
d350: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
d360: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
d370: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
d380: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
d390: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
d3a0: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
d3b0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
d3c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d3d0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
d3e0: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
d3f0: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
d400: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
d410: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
d420: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
d430: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
d440: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
d450: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
d460: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d470: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d480: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
d490: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
d4a0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
d4b0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
d4c0: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
d4d0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
d4e0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
d4f0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
d500: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
d510: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
d520: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
d530: 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74  ULL.** a new dat
d540: 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e  abase with a ran
d550: 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61  dom name is crea
d560: 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f  ted.  This rando
d570: 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74  mly named.** dat
d580: 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
d590: 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  be deleted when 
d5a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d5b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
d5c0: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
d5d0: 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
d5e0: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
d5f0: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
d600: 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
d610: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
d620: 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
d630: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
d640: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
d650: 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
d660: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
d670: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d680: 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
d690: 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
d6a0: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
d6b0: 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
d6c0: 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
d6d0: 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
d6e0: 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
d6f0: 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
d700: 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
d710: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
d720: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d730: 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
d740: 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
d750: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
d760: 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
d770: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
d780: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d790: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
d7a0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
d7b0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
d7c0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
d7d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
d7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
d7f0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
d800: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
d810: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
d820: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d830: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
d840: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
d850: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d870: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
d880: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
d890: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
d8a0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
d8b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
d8c0: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  en() */.){.  sql
d8d0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d8f0: 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  he VFS to use fo
d900: 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  r this btree */.
d910: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d920: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d930: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
d940: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
d950: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
d960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d970: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
d980: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d990: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
d9a0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
d9b0: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
d9c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
d9d0: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
d9e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d9f0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
da00: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
da10: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
da20: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
da30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
da40: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
da50: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
da60: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
da70: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
da80: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
da90: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
daa0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
dab0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
dac0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
dad0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
dae0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
daf0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
db00: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
db10: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
db20: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
db30: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
db40: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
db50: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
db60: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
db70: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
db80: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
db90: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
dba0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
dbb0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
dbc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dbd0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
dbe0: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
dbf0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
dc00: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
dc10: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
dc20: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
dc30: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
dc40: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
dc50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
dc60: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
dc70: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
dc80: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
dc90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dca0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
dcb0: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
dcc0: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
dcd0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
dce0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
dcf0: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
dd00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
dd20: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
dd30: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
dd40: 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
dd50: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
dd60: 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
dd70: 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
dd80: 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
dd90: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
dda0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ddb0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
ddc0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
ddd0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
dde0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
ddf0: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
de00: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
de10: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
de20: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
de30: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
de40: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
de50: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
de60: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  */.  if( isMemdb
de70: 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ==0 && zFilename
de80: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
de90: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
dea0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
deb0: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
dec0: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
ded0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
dee0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
def0: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
df00: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
df10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
df20: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
df30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
df40: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
df50: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
df60: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
df70: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
df90: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
dfa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dfb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
dfc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
dfd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
dfe0: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
dff0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
e000: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e010: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
e020: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
e030: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
e040: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
e050: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e060: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
e070: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
e080: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
e090: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
e0a0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
e0b0: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
e0c0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
e0d0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
e0e0: 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
e0f0: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
e100: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
e110: 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
e120: 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
e130: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
e140: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
e150: 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
e160: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
e170: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
e180: 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ame(pBt->pPager)
e190: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
e1a0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
e1b0: 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
e1c0: 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
e1d0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
e1e0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
e1f0: 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
e200: 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
e210: 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
e220: 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
e230: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
e240: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
e250: 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
e260: 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
e270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
e280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e290: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
e2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
e2b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e2c0: 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e2e0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
e2f0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e310: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
e320: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e330: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
e340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
e350: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e360: 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
e370: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
e380: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
e390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e3a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e3b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e3c0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
e3d0: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
e3e0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
e3f0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
e400: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e410: 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
e420: 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
e430: 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
e440: 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
e450: 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
e460: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
e470: 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
e480: 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
e490: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
e4a0: 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
e4b0: 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
e4c0: 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
e4d0: 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
e4e0: 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
e4f0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
e500: 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
e510: 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
e520: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
e530: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
e540: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
e550: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
e560: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
e570: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
e580: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
e590: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
e5a0: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
e5b0: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
e5c0: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
e5d0: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
e5e0: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
e5f0: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
e600: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
e610: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
e620: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
e630: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
e640: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
e650: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
e660: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
e670: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
e680: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
e690: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
e6a0: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
e6b0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
e6c0: 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
e6d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
e6e0: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
e6f0: 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
e700: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e710: 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
e720: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
e730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
e740: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e750: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
e760: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
e770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e780: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
e790: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
e7a0: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
e7d0: 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
e7e0: 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
e7f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e800: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e810: 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
e820: 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
e830: 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
e840: 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
e850: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
e860: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e870: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
e880: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
e890: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20    }.    pBt->db 
e8a0: 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
e8b0: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
e8c0: 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
e8d0: 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
e8e0: 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
e8f0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
e900: 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
e910: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
e920: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
e930: 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
e940: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
e950: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
e960: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
e970: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74  ->pageSize = get
e980: 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  2byte(&zDbHeader
e990: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  [16]);.    if( p
e9a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
e9b0: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
e9c0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
e9d0: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
e9e0: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
e9f0: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
ea00: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
ea10: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
ea20: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
ea30: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ea40: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
ea50: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
ea60: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
ea70: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
ea80: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
ea90: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
eaa0: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
eab0: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
eac0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
ead0: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
eae0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
eaf0: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
eb00: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
eb10: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
eb20: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
eb30: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
eb40: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
eb50: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
eb60: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
eb70: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
eb80: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
eb90: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
eba0: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
ebb0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
ebc0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
ebd0: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
ebe0: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
ebf0: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
ec00: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
ec10: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
ec20: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
ec30: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
ec40: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
ec50: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
ec60: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
ec70: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
ec80: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ec90: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
eca0: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
ecb0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
ecc0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
ecd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ece0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
ecf0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
ed00: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
ed10: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
ed20: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
ed30: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
ed40: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
ed50: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
ed60: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
ed70: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
ed80: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
ed90: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
eda0: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
edb0: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
edc0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
edd0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
ede0: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
edf0: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
ee00: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
ee10: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
ee20: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
ee30: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
ee40: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
ee50: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
ee60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ee70: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
ee80: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
ee90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
eea0: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
eeb0: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
eec0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
eed0: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
eee0: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
eef0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
ef00: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
ef10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
ef20: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
ef30: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
ef40: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
ef50: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
ef60: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
ef70: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
ef80: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
ef90: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
efa0: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
efb0: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
efc0: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
efd0: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
efe0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
eff0: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
f000: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
f010: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
f020: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f030: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
f040: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
f050: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
f060: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f070: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
f080: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f090: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f0a0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
f0b0: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
f0c0: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
f0d0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
f0e0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
f0f0: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
f100: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
f110: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
f120: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
f130: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f140: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
f150: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f160: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
f170: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
f180: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
f190: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f1a0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
f1b0: 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
f1c0: 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
f1d0: 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
f1e0: 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
f1f0: 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
f200: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
f210: 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
f220: 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
f230: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
f240: 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
f250: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
f260: 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
f270: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
f280: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
f290: 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
f2a0: 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
f2b0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f2c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
f2d0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
f2e0: 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
f2f0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
f300: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
f310: 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
f320: 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
f330: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
f340: 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
f350: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
f360: 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
f370: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
f380: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
f390: 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
f3a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f3b0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
f3c0: 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
f3d0: 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
f3e0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
f3f0: 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
f400: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
f410: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
f420: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
f430: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
f440: 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
f450: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
f460: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
f470: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
f480: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
f490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f4a0: 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
f4b0: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
f4c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f4d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
f4e0: 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
f4f0: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
f500: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
f510: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f520: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
f530: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
f540: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
f550: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
f560: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f570: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
f580: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f590: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
f5a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  = 0;.  }.  if( m
f5b0: 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
f5c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f5d0: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
f5e0: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
f5f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f600: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
f610: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f620: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
f630: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
f640: 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
f650: 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
f660: 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
f670: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
f680: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
f690: 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
f6a0: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
f6b0: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
f6c0: 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
f6d0: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
f6e0: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
f6f0: 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
f700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f710: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
f720: 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
f730: 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
f740: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
f750: 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33  _CACHE.  sqlite3
f760: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
f770: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
f780: 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
f790: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
f7a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f7b0: 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
f7c0: 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72  ex) );.  pMaster
f7d0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f7e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f7f0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
f800: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f810: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
f820: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
f830: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
f840: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
f850: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
f860: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
f870: 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
f880: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
f890: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f8a0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
f8b0: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
f8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
f8d0: 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
f8e0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f8f0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
f900: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
f910: 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
f920: 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
f930: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
f940: 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
f950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f960: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
f970: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
f980: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
f990: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
f9a0: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
f9b0: 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
f9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f9d0: 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
f9e0: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
f9f0: 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
fa00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fa10: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
fa20: 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
fa30: 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
fa40: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
fa50: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
fa60: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
fa70: 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
fa80: 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
fa90: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
faa0: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
fab0: 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
fac0: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
fad0: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
fae0: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
faf0: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
fb00: 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
fb10: 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
fb20: 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
fb30: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
fb40: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
fb50: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
fb60: 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
fb70: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
fb80: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
fb90: 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
fba0: 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
fbb0: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
fbc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
fbd0: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
fbe0: 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
fbf0: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
fc00: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
fc10: 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
fc20: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fc30: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
fc40: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
fc50: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
fc60: 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
fc70: 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
fc80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fc90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
fca0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
fcb0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fcc0: 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
fcd0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
fce0: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
fcf0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
fd00: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
fd10: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
fd20: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
fd30: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
fd40: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
fd50: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
fd60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fd70: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
fd80: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
fd90: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
fda0: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
fdb0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
fdc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
fdd0: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
fde0: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
fdf0: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
fe00: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
fe10: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
fe20: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
fe30: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
fe40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
fe50: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
fe60: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
fe70: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
fe80: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
fe90: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
fea0: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
feb0: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
fec0: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
fed0: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
fee0: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
fef0: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
ff00: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
ff10: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
ff20: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
ff30: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
ff40: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
ff50: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
ff60: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
ff70: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
ff80: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
ff90: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
ffa0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
ffb0: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
ffc0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
ffd0: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
ffe0: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
fff0: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
10000 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
10010 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
10020 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
10030 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
10040 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
10050 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
10060 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
10070 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
10080 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
10090 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
100a0 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
100b0 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
100c0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
100d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
100e0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
100f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10100 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
10110 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10120 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
10130 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
10140 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
10150 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
10160 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
10170 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
10180 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
10190 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
101a0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
101b0 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
101c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
101d0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
101e0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
101f0 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
10200 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
10210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
10220 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
10230 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
10240 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
10250 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
10260 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
10270 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
10280 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
10290 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
102a0 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
102b0 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
102c0 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
102d0 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
102e0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
102f0 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
10300 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
10310 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
10320 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
10330 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
10340 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
10350 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
10360 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
10370 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
10380 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
10390 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
103a0 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
103b0 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
103c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
103d0 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
103e0 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
103f0 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
10400 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
10410 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
10420 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
10430 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
10440 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
10450 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
10460 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
10470 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
10480 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
10490 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
104a0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
104b0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
104c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
104d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
104e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
104f0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
10500 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
10510 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
10520 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
10530 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
10540 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
10550 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10560 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10570 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10580 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
10590 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
105a0 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
105b0 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
105c0 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
105d0 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
105e0 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
105f0 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
10600 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
10610 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
10620 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
10630 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
10640 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
10650 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
10660 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
10670 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
10680 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
10690 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
106a0 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
106b0 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
106c0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
106d0 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
106e0 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
106f0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
10700 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
10710 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
10720 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
10730 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
10740 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
10750 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
10760 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
10770 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65  afetyLevel(Btree
10780 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20   *p, int level, 
10790 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
107a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
107b0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
107c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107d0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
107e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
107f0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10800 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10810 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
10820 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
10830 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
10840 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10850 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10860 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
10870 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
10880 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
10890 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
108a0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
108b0 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
108c0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
108d0 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
108e0 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
108f0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
10900 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
10910 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
10920 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10930 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
10940 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
10950 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10960 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
10970 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
10980 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10990 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
109a0 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
109b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
109c0 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
109d0 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
109e0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
109f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
10a00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10a10 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
10a20 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
10a30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
10a40 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
10a50 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
10a60 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
10a70 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
10a80 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
10a90 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
10aa0 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
10ab0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
10ac0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
10ad0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
10ae0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
10af0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
10b00 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
10b10 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
10b20 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
10b30 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
10b40 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
10b50 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
10b60 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
10b70 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
10b80 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
10b90 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
10ba0 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
10bb0 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
10bc0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
10bd0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
10be0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
10bf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
10c00 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
10c10 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
10c20 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
10c30 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
10c40 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
10c50 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
10c60 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
10c70 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
10c80 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
10c90 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
10ca0 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
10cb0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
10cc0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
10cd0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
10ce0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
10cf0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
10d00 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
10d10 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
10d20 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69  SizeFixed flag i
10d30 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
10d40 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
10d50 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
10d60 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
10d70 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
10d80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10d90 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
10da0 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
10db0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
10dc0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
10dd0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10de0 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
10df0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
10e00 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
10e10 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
10e20 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
10e30 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10e40 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
10e50 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
10e60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10e70 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
10e80 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
10e90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
10ea0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
10eb0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
10ec0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
10ed0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
10ee0 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
10ef0 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
10f00 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
10f10 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
10f20 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
10f30 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
10f40 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
10f50 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
10f60 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
10f70 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
10f80 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
10f90 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
10fa0 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
10fb0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
10fc0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
10fd0 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
10fe0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
10ff0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
11000 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
11010 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
11020 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
11030 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
11040 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
11050 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
11060 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
11070 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
11080 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
11090 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  1;.  sqlite3Btre
110a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
110b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
110c0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
110d0 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
110e0 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
110f0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
11100 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
11110 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
11120 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
11130 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11140 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
11150 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
11160 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
11170 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
11180 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
11190 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
111a0 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
111b0 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
111c0 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
111d0 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
111e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
111f0 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72  eeGetReserve(Btr
11200 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
11210 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11220 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70  nter(p);.  n = p
11230 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
11240 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
11250 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  Size;.  sqlite3B
11260 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11270 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
11280 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
11290 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
112a0 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
112b0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
112c0 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
112d0 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
112e0 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
112f0 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
11300 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
11310 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
11320 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
11330 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
11340 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
11350 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
11360 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
11370 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11380 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11390 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
113a0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
113b0 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
113c0 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
113d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
113e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
113f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
11400 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11410 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
11420 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
11430 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
11440 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
11450 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
11460 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
11470 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
11480 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
11490 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
114a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
114b0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
114c0 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
114d0 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
114e0 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
114f0 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
11500 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
11510 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
11520 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
11530 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11540 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
11550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11560 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
11570 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
11580 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
11590 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
115a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
115b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
115c0 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
115d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
115e0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
115f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
11600 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
11610 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
11620 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11630 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
11640 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f  zeFixed && (av ?
11650 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
11660 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
11670 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
11680 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
11690 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
116a0 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
116b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
116c0 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
116d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
116e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
116f0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
11700 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11710 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
11720 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
11730 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
11740 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
11750 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
11760 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
11770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11780 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
11790 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
117a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
117b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
117c0 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
117d0 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
117e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
117f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11800 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
11810 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
11820 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
11830 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
11840 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
11850 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
11860 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
11870 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
11880 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
11890 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
118a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
118b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
118c0 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
118d0 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
118e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
118f0 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
11900 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
11910 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
11920 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
11930 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
11940 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
11950 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
11960 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
11970 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
11980 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
11990 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
119a0 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
119b0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
119c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
119d0 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
119e0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
119f0 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
11a00 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
11a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
11a20 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
11a30 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
11a40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
11a50 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge1;.  int nPage
11a60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
11a70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11a80 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11a90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
11aa0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
11ab0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
11ac0 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
11ad0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
11ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
11af0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
11b00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
11b10 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
11b20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11b30 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
11b40 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
11b50 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
11b60 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
11b70 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
11b80 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
11b90 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
11ba0 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71   .  */.  rc = sq
11bb0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
11bc0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
11bd0 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
11be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11bf0 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f  .    goto page1_
11c00 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  init_failed;.  }
11c10 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30  else if( nPage>0
11c20 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65   ){.    int page
11c30 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73  Size;.    int us
11c40 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
11c50 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
11c60 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
11c70 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
11c80 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
11c90 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
11ca0 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
11cb0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
11cc0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
11cd0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
11ce0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
11cf0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
11d00 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
11d10 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
11d20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11d30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11d40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
11d50 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
11d60 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
11d70 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
11d80 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
11d90 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
11da0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
11db0 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
11dc0 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
11dd0 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
11de0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
11df0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
11e00 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
11e10 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
11e20 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
11e30 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
11e40 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
11e50 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
11e60 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
11e70 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
11e80 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
11e90 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11ea0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11eb0 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
11ec0 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31   get2byte(&page1
11ed0 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  [16]);.    if( (
11ee0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
11ef0 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67  eSize)!=0 || pag
11f00 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20  eSize<512 ||.   
11f10 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58       (SQLITE_MAX
11f20 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38  _PAGE_SIZE<32768
11f30 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   && pageSize>SQL
11f40 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
11f50 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  E).    ){.      
11f60 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11f70 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
11f80 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
11f90 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
11fa0 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
11fb0 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
11fc0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61  [20];.    if( pa
11fd0 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
11fe0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
11ff0 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
12000 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
12010 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
12020 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
12030 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
12040 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
12050 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
12060 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
12070 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
12080 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
12090 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
120a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
120b0 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
120c0 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
120d0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
120e0 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
120f0 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
12100 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
12110 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
12120 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
12130 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
12140 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12150 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
12160 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
12170 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b  (u16)usableSize;
12180 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
12190 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
121a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
121b0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
121c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
121d0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
121e0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
121f0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12220 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
12230 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
12240 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12250 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
12260 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
12270 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12280 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
12290 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
122a0 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
122b0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
122c0 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62  Size = (u16)usab
122d0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
122e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
122f0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
12300 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
12310 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
12320 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
12330 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
12340 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
12350 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
12360 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
12370 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
12380 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
12390 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
123a0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
123b0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
123c0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
123d0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
123e0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
123f0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
12400 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
12410 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
12420 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
12430 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
12440 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
12450 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
12460 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
12470 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
12480 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
12490 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
124a0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
124b0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
124c0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
124d0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
124e0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
124f0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
12500 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
12510 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
12520 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
12530 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20  -byte poiner, a 
12540 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
12550 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
12560 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
12570 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
12580 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
12590 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
125a0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
125b0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
125c0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
125d0 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
125e0 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
125f0 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  23;.  pBt->minLo
12600 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
12610 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
12620 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
12630 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
12640 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
12650 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
12660 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
12670 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
12680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12690 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
126a0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
126b0 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
126c0 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
126d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
126e0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
126f0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
12700 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
12710 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12730 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
12740 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
12750 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
12760 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
12770 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
12780 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
12790 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
127a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
127b0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
127c0 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
127d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
127e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
127f0 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
12800 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
12810 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
12820 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
12830 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
12840 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
12850 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
12860 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
12880 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12890 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
128a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
128b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
128c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
128d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
128e0 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d  ursor==0 || pBt-
128f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
12900 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
12910 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
12920 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
12930 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
12940 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
12950 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
12960 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
12970 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12980 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
12990 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
129a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
129b0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
129c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
129d0 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
129e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
129f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
12a00 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
12a10 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
12a20 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
12a30 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
12a40 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
12a50 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
12a60 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
12a70 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
12a80 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
12a90 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
12aa0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
12ab0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
12ac0 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
12ad0 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
12ae0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
12af0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
12b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12b10 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12b20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
12b30 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
12b40 64 79 20 62 65 65 6e 20 6d 65 61 73 75 72 65 64  dy been measured
12b50 20 61 6e 64 20 63 61 63 68 65 64 2c 20 73 6f 20   and cached, so 
12b60 66 61 69 6c 75 72 65 0a 20 20 2a 2a 20 69 73 20  failure.  ** is 
12b70 69 6d 70 6f 73 73 69 62 6c 65 20 68 65 72 65 2e  impossible here.
12b80 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
12b90 6c 20 73 69 7a 65 20 6d 65 61 73 75 72 65 6d 65  l size measureme
12ba0 6e 74 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 0a  nt failed, then.
12bb0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
12bc0 61 62 6f 72 74 73 20 62 65 66 6f 72 65 20 65 6e  aborts before en
12bd0 74 65 72 69 6e 67 20 74 68 69 73 20 72 6f 75 74  tering this rout
12be0 69 6e 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ine. */.  rc = s
12bf0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
12c00 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
12c10 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
12c20 20 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54   NEVER(rc!=SQLIT
12c30 45 5f 4f 4b 29 20 7c 7c 20 6e 50 61 67 65 3e 30  E_OK) || nPage>0
12c40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12c50 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
12c60 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
12c70 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
12c80 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
12c90 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
12ca0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
12cb0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
12cc0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12cd0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
12ce0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
12cf0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
12d00 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
12d10 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
12d20 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
12d30 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
12d40 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
12d50 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
12d60 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
12d70 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
12d80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
12d90 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
12da0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
12db0 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
12dc0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
12dd0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
12de0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
12df0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12e00 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
12e10 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
12e20 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
12e30 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
12e40 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
12e50 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
12e60 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
12e70 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
12e80 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12e90 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
12ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12eb0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
12ec0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
12ed0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
12ee0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
12ef0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
12f00 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
12f10 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
12f20 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
12f30 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
12f40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12f50 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12f60 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
12f70 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
12f80 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12fa0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
12fb0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
12fc0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
12fd0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
12fe0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
12ff0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13000 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
13010 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
13020 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
13030 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13040 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
13050 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
13060 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
13070 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
13080 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
13090 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
130a0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
130b0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
130c0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
130d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
130e0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
130f0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
13100 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
13110 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
13120 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
13130 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
13140 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
13150 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
13160 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
13170 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
13180 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
13190 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
131a0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
131b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
131c0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
131d0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
131e0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
131f0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
13200 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
13210 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
13220 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
13230 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
13240 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
13250 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
13260 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
13270 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
13280 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13290 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
132a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
132b0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
132c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
132d0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
132e0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
132f0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
13300 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
13310 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
13320 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
13330 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
13340 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
13350 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
13360 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
13370 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
13380 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13390 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
133a0 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
133b0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
133c0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
133d0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
133e0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
133f0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
13400 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
13410 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
13420 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
13430 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13440 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
13450 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
13460 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
13470 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
13480 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
13490 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
134a0 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
134b0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
134c0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
134d0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
134e0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
134f0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
13500 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
13510 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
13520 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
13530 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
13540 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
13550 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
13560 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
13570 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
13580 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
13590 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
135a0 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
135b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
135c0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
135d0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
135e0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
135f0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
13600 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
13610 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
13620 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
13630 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13640 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
13650 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
13660 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
13670 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
13680 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13690 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
136a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
136b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
136c0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
136d0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
136e0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
136f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
13700 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13710 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
13720 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
13730 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
13740 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
13750 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
13760 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
13770 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
13780 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
13790 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
137a0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
137b0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
137c0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
137d0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
137e0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
137f0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
13800 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
13810 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
13820 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
13830 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
13840 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
13850 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
13860 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13870 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
13880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13890 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
138a0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
138b0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
138c0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
138d0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
138e0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
138f0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
13900 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
13910 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
13920 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
13930 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
13940 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
13950 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
13960 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
13970 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
13980 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
13990 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
139a0 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
139b0 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
139c0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
139d0 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
139e0 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
139f0 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
13a00 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
13a10 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
13a20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
13a30 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
13a40 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
13a50 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
13a60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13a70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13a80 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
13a90 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
13aa0 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
13ab0 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
13ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
13ad0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
13ae0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13af0 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
13b00 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
13b10 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
13b20 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13b30 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
13b40 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
13b50 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
13b60 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
13b70 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
13b80 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
13b90 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
13ba0 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
13bb0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
13bc0 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
13bd0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
13be0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
13bf0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
13c00 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
13c10 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
13c20 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
13c30 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
13c40 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
13c50 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
13c60 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
13c70 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
13c80 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
13c90 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
13ca0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
13cb0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
13cc0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
13cd0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
13ce0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
13cf0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
13d00 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
13d10 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
13d20 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
13d30 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
13d40 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
13d50 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
13d60 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
13d70 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
13d80 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
13d90 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
13da0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
13db0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
13dc0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
13dd0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
13de0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
13df0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
13e00 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
13e10 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
13e20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
13e30 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
13e40 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
13e50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
13e60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
13e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13e90 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
13ea0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
13eb0 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
13ec0 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
13ed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ef0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
13f00 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
13f10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
13f30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13f40 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
13f50 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
13f60 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
13f70 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
13f80 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
13f90 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
13fa0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
13fb0 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
13fc0 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
13fd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13fe0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
13ff0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
14000 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
14010 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
14020 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
14030 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
14040 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
14050 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73  >sharable ){..as
14060 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
14070 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
14080 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
14090 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
140a0 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
140b0 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
140c0 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
140d0 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
140e0 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
140f0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
14100 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
14110 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
14120 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
14130 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
14140 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
14150 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14160 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
14170 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
14180 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
14190 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
141a0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
141b0 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c  CHE.    if( wrfl
141c0 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ag ){.      asse
141d0 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
141e0 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
141f0 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
14200 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73     pBt->isExclus
14210 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61  ive = (u8)(wrfla
14220 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  g>1);.    }.#end
14230 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
14240 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
14250 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
14260 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
14270 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
14280 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
14290 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
142a0 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
142b0 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
142c0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
142d0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
142e0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
142f0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
14300 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
14310 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
14320 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
14330 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
14340 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
14350 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
14360 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
14370 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
14380 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
14390 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
143a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
143b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
143c0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
143d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
143e0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
143f0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
14400 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
14410 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
14420 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
14430 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
14440 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
14450 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
14460 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
14470 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
14480 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
14490 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
144a0 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
144b0 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
144c0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
144d0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14500 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
14510 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14530 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14540 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
14550 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
14560 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14580 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
14590 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
145a0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
145b0 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
145c0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
145d0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
145e0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
145f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14600 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
14610 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
14620 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
14630 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
14640 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14650 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
14660 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
14670 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
14680 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
14690 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
146a0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
146b0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
146c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
146d0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
146e0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
146f0 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
14700 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
14710 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
14720 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
14730 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
14740 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
14750 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
14760 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
14770 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
14780 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
14790 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
147a0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
147b0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
147c0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
147d0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
147e0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
147f0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
14800 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
14810 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
14820 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
14830 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
14840 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
14850 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14860 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
14870 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
14880 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
14890 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
148a0 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
148b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
148c0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
148d0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
148e0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
148f0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
14900 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
14910 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
14920 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
14930 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14940 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14950 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
14980 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
14990 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
149a0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
149b0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
149c0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
149d0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
149e0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
149f0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
14a00 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
14a10 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
14a20 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
14a30 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
14a40 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
14a50 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
14a60 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
14a70 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
14a80 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
14a90 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
14aa0 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
14ab0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
14ac0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
14ad0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
14ae0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
14af0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14b00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
14b10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
14b20 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
14b30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
14b40 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
14b50 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14b60 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
14b70 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
14b80 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
14b90 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
14ba0 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
14bb0 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
14bc0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
14bd0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
14be0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
14bf0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14c00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
14c10 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
14c20 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
14c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
14c40 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
14c50 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
14c60 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
14c70 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65  Cell;..    btree
14c80 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
14c90 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
14ca0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
14cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
14cc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
14cd0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14ce0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
14cf0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
14d00 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
14d10 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
14d20 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
14d30 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
14d40 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14d50 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
14d60 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
14d70 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
14d80 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
14d90 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
14da0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b  o.iOverflow]) ){
14db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
14dc0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
14dd0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54  o.iOverflow], iT
14de0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
14df0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
14e00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
14e30 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
14e40 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
14e50 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
14e60 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e80 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14e90 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
14ea0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
14eb0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
14ec0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
14ed0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
14ee0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
14ef0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
14f00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
14f10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
14f20 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
14f30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
14f40 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
14f50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
14f60 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
14f70 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
14f80 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
14f90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14fa0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
14fb0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
14fc0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
14fd0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
14fe0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
14ff0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
15000 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
15010 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
15020 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
15030 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
15040 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
15050 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
15060 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
15070 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
15080 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
15090 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
150a0 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
150b0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
150c0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
150d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
150e0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
150f0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
15100 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
15110 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
15120 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
15130 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
15140 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
15150 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
15160 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
15170 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
15180 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
15190 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
151a0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
151b0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
151c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
151d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
151e0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
151f0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
15200 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
15210 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
15220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
15230 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
15240 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
15250 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
15260 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
15270 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
15280 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
15290 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
152a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
152b0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
152c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
152d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
152e0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
152f0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
15300 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
15310 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
15320 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
15330 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
15340 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
15350 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
15360 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
15370 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
15380 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
15390 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
153a0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
153b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
153c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
153d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
153e0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
153f0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
15400 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
15410 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
15420 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
15430 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
15440 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
15450 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
15460 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
15470 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
15480 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
15490 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
154a0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
154b0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
154c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
154d0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
154e0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
154f0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
15500 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
15510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
15530 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
15540 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
15550 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
15560 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
15570 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
15580 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
15590 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
155a0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
155b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
155c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
155d0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
155e0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
155f0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
15600 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
15610 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
15620 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
15630 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
15640 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
15650 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
15660 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
15670 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
15680 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
15690 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
156a0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
156b0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
156c0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
156d0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
156e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
156f0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
15700 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
15710 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
15720 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
15730 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
15740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15750 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15760 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15770 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
15780 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
15790 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
157a0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
157b0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
157c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
157d0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
157e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
157f0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
15800 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15820 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15840 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
15850 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
15860 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
15870 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
15880 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
15890 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
158a0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
158b0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
158c0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
158d0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
158e0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
158f0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
15900 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
15910 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
15920 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
15930 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
15940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15950 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
15960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
15970 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
15980 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
15990 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
159a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
159b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
159c0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
159d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
159e0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
159f0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
15a00 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
15a10 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
15a20 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
15a30 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
15a40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15a50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15a60 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
15a70 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
15a80 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
15a90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15aa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
15ab0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
15ac0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
15ad0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
15ae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
15af0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
15b00 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
15b10 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
15b20 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
15b30 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
15b40 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
15b50 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
15b60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
15b70 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
15b80 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
15b90 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
15ba0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
15bb0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
15bc0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
15bd0 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
15be0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
15bf0 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
15c00 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
15c10 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
15c20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
15c30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
15c40 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
15c50 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
15c60 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
15c70 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
15c80 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
15c90 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
15ca0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
15cb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
15cc0 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
15cd0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
15ce0 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
15cf0 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
15d00 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
15d10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
15d20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
15d30 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
15d40 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
15d50 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
15d60 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
15d70 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
15d80 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
15d90 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73  ete.  If nFin is
15da0 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73   zero, it is ass
15db0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63  umed that.** inc
15dc0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 77 69  rVacuumStep() wi
15dd0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66  ll be called a f
15de0 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20  inite amount of 
15df0 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d  times.** which m
15e00 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d  ay or may not em
15e10 70 74 79 20 74 68 65 20 66 72 65 65 6c 69 73 74  pty the freelist
15e20 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61  .  A full autova
15e30 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e  cuum.** has nFin
15e40 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69  >0.  A "PRAGMA i
15e50 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
15e60 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a  m" has nFin==0..
15e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
15e80 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
15e90 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
15ea0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
15eb0 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  tPg){.  Pgno nFr
15ec0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
15ed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15ee0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
15ef0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
15f00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15f10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15f20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15f30 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
15f40 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
15f50 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
15f60 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
15f70 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
15f80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
15f90 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15fa0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
15fb0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
15fc0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
15fd0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
15fe0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
15ff0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
16000 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
16010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
16020 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
16030 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
16040 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
16050 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
16060 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
16080 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16090 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
160a0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
160b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
160c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
160d0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
160e0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
160f0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
16100 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
16110 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
16120 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
16130 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
16140 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
16150 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
16160 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
16170 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
16180 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
16190 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
161a0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
161b0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
161c0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
161d0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
161e0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
161f0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
16200 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
16210 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
16220 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
16230 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
16240 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
16250 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
16260 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
16270 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
16280 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
16290 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
162a0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
162b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
162c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
162d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
162e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
162f0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
16300 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
16310 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
16320 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16330 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
16340 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
16350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16360 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
16370 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
16380 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
16390 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
163a0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
163b0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
163c0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
163d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
163e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
163f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16400 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
16410 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
16420 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
16430 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
16440 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
16450 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
16460 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
16470 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
16480 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
16490 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
164a0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
164b0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
164c0 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
164d0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
164e0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
164f0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
16500 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
16510 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
16520 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
16530 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
16540 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
16550 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
16560 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
16570 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
16580 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
16590 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
165a0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
165b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
165c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
165d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
165e0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
165f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16600 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16610 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
16620 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
16630 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
16640 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
16650 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
16660 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
16670 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
16680 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
16690 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
166a0 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
166b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
166c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
166d0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
166e0 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
166f0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
16700 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
16710 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
16720 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16730 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
16740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16760 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16770 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
16780 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
16790 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
167a0 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
167b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
167c0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
167d0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
167e0 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
167f0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
16800 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
16810 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
16820 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69   *pPg;.        i
16830 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
16840 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
16850 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
16860 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
168a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
168b0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
168c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
168d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
168e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
168f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16900 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16910 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
16920 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74     }.      iLast
16930 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Pg--;.    }.    
16940 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
16950 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
16960 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b  Pager, iLastPg);
16970 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
16980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16990 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
169a0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
169b0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
169c0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
169d0 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
169e0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
169f0 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
16a00 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
16a10 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
16a20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
16a30 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
16a40 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
16a50 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
16a60 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
16a70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
16a80 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
16a90 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
16aa0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
16ab0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
16ac0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
16ad0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16ae0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
16af0 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
16b00 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
16b10 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
16b20 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16b30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
16b40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
16b50 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
16b60 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
16b70 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
16b80 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
16b90 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
16ba0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
16bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
16bc0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
16bd0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
16be0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
16bf0 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
16c00 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
16c10 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
16c20 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pBt));.  }.  sql
16c30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16c40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16c50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16c60 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16c70 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
16c80 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
16c90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
16ca0 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f  * is commited fo
16cb0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
16cc0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
16cd0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
16ce0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
16cf0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
16d00 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
16d10 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
16d20 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
16d30 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
16d40 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
16d50 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
16d60 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
16d70 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
16d80 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
16d90 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
16da0 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
16db0 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
16dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
16dd0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
16de0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
16df0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16e00 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
16e10 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
16e20 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
16e30 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
16e40 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
16e50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65  ager) );..  asse
16e60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16e70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
16e80 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
16e90 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
16ea0 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
16eb0 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
16ec0 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
16ed0 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
16ee0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
16ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16f00 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
16f10 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
16f20 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
16f30 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
16f40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
16f50 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
16f60 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
16f70 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d  /.    Pgno nPtrm
16f80 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ap;      /* Numb
16f90 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
16fa0 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
16fb0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
16fc0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
16fd0 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
16fe0 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  freed */.    int
16ff0 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
17000 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
17010 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d  ries on one ptrm
17020 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  ap page */.    P
17030 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
17040 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
17050 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
17060 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
17070 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
17080 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
17090 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
170a0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
170b0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
170c0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
170d0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
170e0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
170f0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
17100 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
17110 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
17120 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
17130 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
17140 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
17150 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
17160 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
17170 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
17180 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
17190 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
171a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
171b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
171c0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
171d0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
171e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
171f0 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20  );.    nEntry = 
17200 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
17210 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d  5;.    nPtrmap =
17220 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
17230 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
17240 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
17250 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e  nEntry;.    nFin
17260 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
17270 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
17280 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
17290 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
172a0 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
172b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
172c0 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  ){.      nFin--;
172d0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
172e0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
172f0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
17300 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
17310 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
17320 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
17330 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  }.    if( nFin>n
17340 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
17350 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17360 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65  T;..    for(iFre
17370 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
17380 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
17390 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
173a0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
173b0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
173c0 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20  Fin, iFree);.   
173d0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
173e0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
173f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
17400 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
17410 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
17420 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
17430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
17440 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
17450 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
17460 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
17470 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
17480 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
17490 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
174a0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
174b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
174c0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
174d0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  t->pPager, nFin)
174e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
174f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17510 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
17520 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
17530 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
17540 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
17550 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
17560 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17570 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
17580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17590 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
175a0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
175b0 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
175c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
175d0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
175e0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
175f0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
17600 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
17610 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
17620 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17630 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
17640 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
17650 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
17660 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
17670 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
17680 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
17690 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
176a0 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
176b0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
176c0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
176d0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
176e0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
176f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
17700 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
17710 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
17720 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
17730 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
17740 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
17750 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
17760 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
17770 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
17780 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
17790 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
177a0 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
177b0 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
177c0 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
177d0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
177e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
177f0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
17800 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
17810 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
17820 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
17830 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
17840 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
17850 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
17860 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
17870 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
17880 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
17890 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
178a0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
178b0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
178c0 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
178d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
178e0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
178f0 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
17900 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
17910 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17920 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
17930 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
17940 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
17950 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
17960 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
17970 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
17980 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
17990 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
179a0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
179b0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
179c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
179d0 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
179e0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
179f0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
17a00 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
17a10 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
17a20 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
17a30 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
17a40 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
17a50 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
17a60 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
17a70 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
17a80 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
17a90 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
17aa0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
17ab0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
17ac0 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
17ad0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
17ae0 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
17af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
17b00 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
17b10 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
17b20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
17b30 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
17b40 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
17b50 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
17b60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17b70 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
17b80 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
17b90 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
17ba0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
17bb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17bc0 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
17bd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17be0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
17bf0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
17c00 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
17c10 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
17c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17c50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
17c60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17c70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
17c80 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
17c90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
17ca0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
17cb0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
17cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
17cd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
17ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17cf0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17d00 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
17d10 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
17d20 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
17d30 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
17d40 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
17d50 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
17d60 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
17d70 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
17d80 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
17d90 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
17da0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17db0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72    BtCursor *pCsr
17dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17dd0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
17de0 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  ex(p) );..  /* S
17df0 65 61 72 63 68 20 66 6f 72 20 61 20 63 75 72 73  earch for a curs
17e00 6f 72 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20  or held open by 
17e10 74 68 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e  this b-tree conn
17e20 65 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65  ection. If one e
17e30 78 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  xists,.  ** then
17e40 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17e50 20 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61   will be downgra
17e60 64 65 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ded to a read-on
17e70 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ly transaction. 
17e80 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61   ** instead of a
17e90 63 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ctually conclude
17ea0 64 2e 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  d. A subsequent 
17eb0 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68  call to CommitPh
17ec0 61 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f  aseTwo() .  ** o
17ed0 72 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c  r Rollback() wil
17ee0 6c 20 66 69 6e 69 73 68 20 74 68 65 20 74 72 61  l finish the tra
17ef0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
17f00 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
17f10 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72  .  */.  for(pCsr
17f20 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
17f30 43 73 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74  Csr && pCsr->pBt
17f40 72 65 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73  ree!=p; pCsr=pCs
17f50 72 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73  r->pNext);.  ass
17f60 65 72 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20  ert( pCsr==0 || 
17f70 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
17f80 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65  _NONE );..  btre
17f90 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
17fa0 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73  (pBt);.  if( pCs
17fb0 72 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61  r ){.    downgra
17fc0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
17fd0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
17fe0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
17ff0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
18000 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
18010 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
18020 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
18030 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
18040 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
18050 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
18060 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
18070 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
18080 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
18090 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
180a0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
180b0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
180c0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
180d0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
180e0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
180f0 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
18100 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
18110 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
18120 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
18130 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
18140 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
18150 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
18160 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
18170 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
18180 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
18190 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
181a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
181b0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
181c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
181d0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
181e0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
181f0 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
18200 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
18210 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
18220 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
18230 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
18240 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
18250 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
18260 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
18270 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
18280 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
18290 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
182a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
182b0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
182c0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
182d0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
182e0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
182f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
18300 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
18310 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
18320 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
18330 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
18340 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
18350 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
18360 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
18370 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
18380 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
18390 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
183a0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
183b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
183c0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
183d0 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
183e0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
183f0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
18400 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
18410 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
18420 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
18430 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
18440 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
18450 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
18460 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
18470 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
18480 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
18490 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
184a0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
184b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
184c0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
184d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
184e0 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
184f0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
18500 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
18510 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
18520 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18530 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
18540 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
18550 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
18560 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
18570 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
18580 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
18590 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
185a0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
185b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
185c0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
185d0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
185e0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
185f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
18600 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
18610 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
18620 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
18630 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
18640 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
18650 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
18660 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
18670 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
18680 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
18690 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
186a0 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  nt rc;.    asser
186b0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
186c0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
186d0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
186e0 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
186f0 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
18700 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
18710 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
18720 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
18730 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18740 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18750 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18760 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18770 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
18780 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
18790 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
187a0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
187b0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
187c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
187d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
187e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
187f0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
18800 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
18810 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
18820 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
18830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
18840 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18850 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
18860 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
18870 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
18880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18890 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
188a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
188b0 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
188c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
188d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
188e0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
188f0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
18900 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18910 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
18920 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
18930 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
18940 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
18950 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
18960 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
18970 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
18980 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
18990 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
189a0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
189b0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72  is routine, a wr
189c0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e  ite-cursor is an
189d0 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
189e0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77   is capable of w
189f0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
18a00 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61  tabse.  That mea
18a10 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ns the cursor wa
18a20 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20  s.** originally 
18a30 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
18a40 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ng and the curso
18a50 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73  r has not be dis
18a60 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69  abled.** by havi
18a70 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61  ng its state cha
18a80 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46  nged to CURSOR_F
18a90 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AULT..*/.static 
18aa0 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
18ab0 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
18ac0 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
18ad0 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
18ae0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
18af0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
18b00 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
18b10 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
18b20 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
18b30 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
18b40 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
18b50 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
18b60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
18b70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
18b80 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
18b90 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
18ba0 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
18bb0 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
18bc0 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
18bd0 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74  on BtShared that
18be0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
18bf0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  ences..**.** Eve
18c00 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69  ry cursor is tri
18c10 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
18c20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c  cursors that bel
18c30 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20  ong.** to other 
18c40 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18c50 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
18c60 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a   to be sharing.*
18c70 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  * the cache with
18c80 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
18c90 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
18ca0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
18cb0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a  ollback occurs..
18cc0 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75  ** All cursors u
18cd0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61  sing the same ca
18ce0 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70  che must be trip
18cf0 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e  ped.** to preven
18d00 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69  t them from tryi
18d10 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74  ng to use the bt
18d20 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ree after.** the
18d30 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
18d40 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
18d50 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73  e deleted tables
18d60 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f  .** or moved roo
18d70 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69  t pages, so it i
18d80 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
18d90 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20   to.** save the 
18da0 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
18db0 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  sor.  The cursor
18dc0 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
18dd0 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  lidated..*/.void
18de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
18df0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
18e00 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
18e10 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72  rrCode){.  BtCur
18e20 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  sor *p;.  sqlite
18e30 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
18e40 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
18e50 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
18e60 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
18e70 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
18e80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
18e90 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
18ea0 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
18eb0 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20  RSOR_FAULT;.    
18ec0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
18ed0 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69  rCode;.    for(i
18ee0 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
18ef0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18f00 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
18f10 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  ge[i]);.      p-
18f20 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
18f30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18f40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
18f50 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
18f60 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
18f70 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
18f80 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
18f90 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
18fa0 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
18fb0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
18fc0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
18fd0 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
18fe0 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
18ff0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
19000 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
19010 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
19020 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
19030 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
19040 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
19050 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19060 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
19070 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
19080 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
19090 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
190a0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
190b0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
190c0 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a  back(Btree *p){.
190d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
190e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
190f0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
19100 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
19110 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19120 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
19130 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
19140 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19150 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
19160 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  HE.  if( rc!=SQL
19170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
19180 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69   This is a horri
19190 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41  ble situation. A
191a0 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29  n IO or malloc()
191b0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
191c0 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
191d0 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
191e0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
191f0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
19200 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
19210 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
19220 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
19230 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
19240 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
19250 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
19260 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
19270 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
19280 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
19290 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
192a0 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
192b0 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
192c0 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
192d0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
192e0 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
192f0 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
19300 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
19310 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
19320 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
19330 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
19340 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
19350 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
19360 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
19370 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
19380 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
19390 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
193a0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
193b0 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
193c0 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
193d0 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
193e0 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
193f0 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
19400 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
19410 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
19420 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
19430 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
19440 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
19450 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
19460 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
19470 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
19480 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
19490 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
194a0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
194b0 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
194c0 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
194d0 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
194e0 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
194f0 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
19500 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
19510 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
19520 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
19530 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
19540 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19550 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
19560 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
19570 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
19580 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
19590 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
195a0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
195b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
195c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
195d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
195e0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
195f0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
19600 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
19610 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
19620 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
19630 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
19640 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
19650 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
19660 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
19670 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
19680 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
19690 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
196a0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
196b0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
196c0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
196d0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
196e0 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
196f0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
19700 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
19710 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
19720 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
19730 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
19740 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
19750 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
19760 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
19770 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
19780 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
19790 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
197a0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
197b0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
197c0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
197d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
197e0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
197f0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
19800 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
19810 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
19820 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
19830 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
19840 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
19850 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
19860 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
19870 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
19880 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
19890 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
198a0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
198b0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
198c0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
198d0 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
198e0 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
198f0 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
19900 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
19910 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
19920 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
19930 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
19940 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
19950 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
19960 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
19970 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
19980 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
19990 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
199a0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
199b0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
199c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
199d0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
199e0 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
199f0 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
19a00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19a10 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
19a20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
19a40 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19a50 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
19a60 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d  ( pBt->readOnly=
19a70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19a80 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
19a90 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
19aa0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
19ab0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20  epoint );.  if( 
19ac0 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73  NEVER(p->inTrans
19ad0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
19ae0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
19af0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19b00 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d  TE_INTERNAL;.  }
19b10 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19b20 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19b30 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
19b40 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74  E );.    /* At t
19b50 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
19b60 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
19b70 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
19b80 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20  epoint with.    
19b90 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
19ba0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
19bb0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
19bc0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
19bd0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  .    ** SQL stat
19be0 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
19bf0 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
19c00 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
19c10 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  ck any.    ** su
19c20 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
19c30 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
19c40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
19c50 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
19c60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
19c70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19c80 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
19c90 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
19ca0 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ment);.  }.  sql
19cb0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19cc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
19ce0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
19cf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
19d00 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
19d10 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
19d20 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
19d30 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
19d40 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
19d50 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
19d60 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
19d70 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
19d80 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
19d90 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
19da0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
19db0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
19dc0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
19dd0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
19de0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
19df0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
19e00 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
19e10 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19e20 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
19e30 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
19e40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
19e50 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
19e60 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
19e70 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
19e80 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
19e90 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
19ea0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
19eb0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
19ec0 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
19ed0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
19ee0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
19ef0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
19f00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19f10 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
19f20 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
19f30 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
19f40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19f50 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
19f60 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
19f70 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
19f80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19f90 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
19fa0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
19fb0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
19fc0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
19fd0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
19fe0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
19ff0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1a000 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1a010 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1a020 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1a030 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a050 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1a060 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1a070 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1a080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a090 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e   ){.      rc = n
1a0a0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1a0b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a0c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a0d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a0e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1a0f0 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
1a100 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
1a110 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
1a120 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
1a130 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
1a140 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
1a150 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
1a160 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
1a170 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
1a180 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
1a190 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1a1a0 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
1a1b0 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
1a1c0 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
1a1d0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1a1e0 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
1a1f0 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
1a200 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
1a210 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1a220 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
1a230 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
1a240 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
1a250 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
1a260 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
1a270 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
1a280 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
1a290 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1a2a0 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
1a2b0 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
1a2c0 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
1a2d0 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
1a2e0 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
1a2f0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
1a300 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
1a310 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
1a320 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
1a330 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
1a340 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1a350 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1a360 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
1a370 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
1a380 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a390 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
1a3a0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
1a3b0 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
1a3c0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
1a3d0 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
1a3e0 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
1a3f0 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
1a400 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
1a410 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
1a420 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
1a430 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
1a440 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
1a450 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
1a460 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
1a470 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
1a480 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
1a490 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
1a4a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a4b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
1a4c0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
1a4d0 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
1a4e0 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
1a4f0 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
1a500 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1a510 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
1a520 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
1a530 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
1a540 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1a550 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
1a560 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
1a570 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
1a580 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
1a590 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
1a5a0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
1a5b0 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
1a5c0 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
1a5d0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1a5e0 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
1a5f0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62  eeCursorSize() b
1a600 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a  ytes of memory .
1a610 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
1a620 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20   pCur have been 
1a630 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61  zeroed by the ca
1a640 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a650 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1a660 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a690 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a6a0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1a6d0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1a6e0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1a6f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a710 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a720 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a730 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a740 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a750 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1a760 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1a770 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1a780 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1a7b0 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1a7c0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1a7d0 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1a7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1a7f0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1a800 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1a810 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1a820 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1a830 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1a840 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1a850 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1a860 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1a870 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1a880 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1a890 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1a8a0 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1a8b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1a8c0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1a8d0 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1a8e0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1a8f0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1a900 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1a910 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1a920 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1a930 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1a940 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1a950 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1a960 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1a970 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1a980 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1a990 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a9a0 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1a9b0 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1a9c0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1a9d0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1a9e0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1a9f0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1aa00 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1aa10 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1aa20 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1aa30 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1aa40 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1aa50 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1aa60 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1aa70 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1aa80 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1aa90 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1aaa0 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1aab0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1aac0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1aad0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1aae0 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
1aaf0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1ab00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ab10 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1ab20 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1ab30 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1ab40 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1ab50 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1ab60 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1ab70 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1ab80 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1ab90 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1aba0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1abb0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1abc0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1abd0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1abe0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1abf0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1ac00 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1ac10 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1ac20 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1ac30 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1ac40 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1ac50 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1ac60 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1ac70 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1ac80 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1ac90 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1aca0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1acb0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1acc0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1acd0 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1ace0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1acf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1ad00 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ad10 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1ad50 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad80 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1ad90 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1ada0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1add0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1ade0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1adf0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1ae00 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1ae10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1ae20 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1ae30 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1ae40 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1ae70 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1ae80 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1ae90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1aea0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1aeb0 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1aec0 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1aed0 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1aee0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aef0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1af00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1af10 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1af20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1af30 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1af40 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1af50 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1af60 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1af70 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1af80 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1af90 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1afa0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1afb0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1afc0 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1afd0 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1afe0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1aff0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1b000 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1b010 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1b020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b030 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1b040 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1b050 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
1b060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1b070 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1b080 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
1b090 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
1b0a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1b0b0 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
1b0c0 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
1b0d0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1b0e0 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
1b0f0 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
1b100 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
1b110 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
1b120 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
1b130 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
1b140 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
1b150 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
1b160 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1b170 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
1b180 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
1b190 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
1b1a0 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
1b1b0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1b1c0 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
1b1d0 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
1b1e0 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
1b1f0 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
1b200 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
1b210 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
1b220 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
1b230 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1b240 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
1b250 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
1b260 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
1b270 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
1b280 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
1b290 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
1b2a0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
1b2b0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1b2c0 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
1b2d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b2e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
1b2f0 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
1b300 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
1b310 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
1b320 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1b330 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1b340 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
1b350 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
1b360 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
1b370 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b380 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1b390 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
1b3a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b3b0 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
1b3c0 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
1b3d0 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
1b3e0 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
1b3f0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1b400 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1b410 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
1b420 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
1b430 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
1b440 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
1b450 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1b460 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
1b470 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
1b480 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
1b490 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
1b4a0 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
1b4b0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1b4c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1b4d0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
1b4e0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1b4f0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1b500 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1b510 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1b520 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1b530 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1b540 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1b550 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1b560 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1b570 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1b580 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1b590 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1b5a0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1b5b0 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1b5c0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1b5d0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1b5e0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1b5f0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1b600 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1b610 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1b620 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1b630 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1b640 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1b650 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1b660 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1b670 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1b680 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1b690 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1b6a0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1b6b0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1b6c0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1b6d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1b6e0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1b6f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b700 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1b710 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1b720 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1b730 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
1b740 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1b750 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
1b760 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1b770 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1b780 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b790 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1b7a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b7c0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1b7d0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1b7e0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1b7f0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1b800 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1b810 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1b820 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1b830 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1b840 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1b850 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1b860 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1b870 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1b880 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1b890 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1b8a0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1b8b0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1b8c0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1b8d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1b8e0 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1b8f0 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1b900 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1b910 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1b920 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1b930 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1b940 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1b950 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1b960 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1b970 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1b980 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1b990 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1b9a0 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1b9b0 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1b9c0 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1b9d0 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1b9e0 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1b9f0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1ba00 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1ba10 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1ba20 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1ba30 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1ba40 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1ba50 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1ba60 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1ba70 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1ba80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1ba90 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1baa0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1bab0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1bac0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1bad0 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1bae0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1baf0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1bb00 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1bb10 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1bb20 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1bb30 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1bb40 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1bb50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1bb60 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
1bb70 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1bb80 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1bb90 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1bba0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1bbb0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1bbc0 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1bbd0 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1bbe0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1bbf0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1bc00 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1bc10 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1bc20 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1bc30 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1bc40 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1bc50 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1bc60 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1bc70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1bc80 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1bc90 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1bca0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1bcb0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1bcc0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1bcd0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1bce0 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1bcf0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1bd00 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1bd10 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1bd20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1bd30 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1bd40 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1bd50 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1bd60 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1bd70 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1bd80 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1bd90 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1bde0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1be30 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1be80 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1be90 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1bea0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1beb0 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
1bec0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1bed0 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1bf10 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bf60 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1bf70 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bfb0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
1bfc0 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e  MSC_VER */..#ifn
1bfd0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
1bfe0 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
1bff0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1c000 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1c010 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
1c020 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1c030 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
1c040 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
1c050 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
1c060 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
1c070 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
1c080 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
1c090 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
1c0a0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
1c0b0 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
1c0c0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
1c0d0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1c0e0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
1c0f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1c100 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
1c110 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1c120 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
1c130 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1c140 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
1c150 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
1c160 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1c170 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
1c180 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
1c190 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
1c1a0 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
1c1b0 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
1c1c0 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
1c1d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1c1e0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
1c1f0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
1c200 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1c210 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
1c220 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
1c230 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
1c240 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c250 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
1c260 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
1c270 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1c280 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
1c290 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1c2a0 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
1c2b0 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
1c2c0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1c2d0 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
1c2e0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1c2f0 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
1c300 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c310 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
1c320 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1c330 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1c340 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1c350 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1c360 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1c370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c380 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c390 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1c3a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c3b0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
1c3c0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1c3d0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
1c3e0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1c3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65  }else{.    getCe
1c400 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1c410 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1c420 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1c430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c440 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
1c450 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
1c460 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1c470 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
1c480 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
1c490 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1c4a0 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
1c4b0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
1c4c0 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
1c4d0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1c4e0 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
1c4f0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
1c500 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1c510 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
1c520 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
1c530 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
1c540 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
1c550 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
1c560 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
1c570 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1c580 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
1c590 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
1c5a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1c5b0 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
1c5c0 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
1c5d0 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
1c5e0 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
1c5f0 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
1c600 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
1c610 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
1c620 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
1c630 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
1c640 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1c650 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1c660 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1c670 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1c680 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1c690 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1c6a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c6b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
1c6c0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1c6d0 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
1c6e0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1c6f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1c700 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
1c710 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1c720 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
1c730 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
1c740 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
1c750 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
1c760 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
1c770 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1c780 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
1c790 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
1c7a0 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
1c7b0 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
1c7c0 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
1c7d0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
1c7e0 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
1c7f0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
1c800 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
1c810 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
1c820 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
1c830 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c840 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
1c850 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1c860 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
1c870 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
1c880 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1c890 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1c8a0 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
1c8b0 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
1c8c0 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
1c8d0 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
1c8e0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1c8f0 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
1c900 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
1c910 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
1c920 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
1c930 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
1c940 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
1c950 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
1c960 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
1c970 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
1c980 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
1c990 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
1c9a0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1c9b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
1c9c0 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
1c9d0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1c9e0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1c9f0 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
1ca00 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
1ca10 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
1ca20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
1ca30 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
1ca40 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
1ca50 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
1ca60 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
1ca70 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
1ca80 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
1ca90 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
1caa0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1cab0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1cac0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
1cad0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1cae0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1caf0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1cb00 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1cb10 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
1cb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1cb30 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
1cb40 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1cb50 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1cb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1cb70 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
1cb80 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
1cb90 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
1cba0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
1cbb0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
1cbc0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1cbd0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
1cbe0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
1cbf0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1cc00 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
1cc10 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1cc20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1cc30 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1cc40 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
1cc50 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
1cc60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cc70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
1cc80 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
1cc90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1cca0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
1ccb0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
1ccc0 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
1ccd0 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
1cce0 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
1ccf0 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
1cd00 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1cd10 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
1cd20 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
1cd30 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
1cd40 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
1cd50 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
1cd60 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
1cd70 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
1cd80 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
1cd90 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
1cda0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
1cdb0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
1cdc0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1cdd0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
1cde0 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
1cdf0 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
1ce00 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
1ce10 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1ce20 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
1ce30 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
1ce40 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1ce50 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
1ce60 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
1ce70 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65  Guess<=pagerPage
1ce80 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
1ce90 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1cea0 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
1ceb0 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
1cec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ced0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
1cee0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1cef0 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
1cf00 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
1cf10 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
1cf20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1cf30 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1cf40 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1cf50 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
1cf60 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
1cf70 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
1cf80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cf90 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1cfa0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
1cfb0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61  pPage, 0);.    a
1cfc0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1cfd0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
1cfe0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1cff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d000 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
1d010 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1d020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
1d030 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
1d040 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
1d050 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
1d060 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
1d070 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d080 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
1d090 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1d0a0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
1d0b0 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
1d0c0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1d0d0 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
1d0e0 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
1d0f0 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
1d100 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
1d110 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d120 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
1d130 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1d140 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
1d150 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
1d160 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
1d170 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
1d180 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
1d190 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
1d1a0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
1d1b0 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
1d1c0 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
1d1d0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1d1e0 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1d1f0 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
1d200 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
1d210 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1d220 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1d230 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
1d240 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1d250 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1d260 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
1d270 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
1d280 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1d290 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
1d2a0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
1d2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1d2c0 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
1d2d0 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
1d2e0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1d2f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d300 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
1d310 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
1d320 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d330 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
1d340 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
1d370 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
1d380 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
1d390 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
1d3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1d3b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
1d3c0 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
1d3d0 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
1d3e0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
1d3f0 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
1d400 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
1d410 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
1d420 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1d430 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
1d440 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d460 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d470 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
1d480 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
1d490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1d4a0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
1d4b0 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
1d4c0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
1d4d0 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
1d4e0 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
1d4f0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
1d500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d510 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d520 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1d530 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
1d540 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
1d550 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
1d560 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1d570 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1d580 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20  pointing to. If 
1d590 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d  the eOp.** param
1d5a0 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20  eter is 0, this 
1d5b0 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
1d5c0 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64  ion (data copied
1d5d0 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20   into.** buffer 
1d5e0 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20  pBuf). If it is 
1d5f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74  non-zero, a writ
1d600 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66  e (data copied f
1d610 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  rom.** buffer pB
1d620 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  uf)..**.** A tot
1d630 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
1d640 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
1d650 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
1d660 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
1d670 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
1d680 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
1d690 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
1d6a0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
1d6b0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1d6c0 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
1d6d0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
1d6e0 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
1d6f0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
1d700 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1d710 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
1d720 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c  tCursor.isIncrbl
1d730 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1d740 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75   set, and the cu
1d750 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20  rrent.** cursor 
1d760 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
1d770 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
1d780 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63  pages, this func
1d790 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  tion.** allocate
1d7a0 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  s space for and 
1d7b0 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73  lazily popluates
1d7c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1d7d0 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68  ge-list .** cach
1d7e0 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
1d7f0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75  r.aOverflow). Su
1d800 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
1d810 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65  se this.** cache
1d820 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
1d830 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
1d840 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66   offset more eff
1d850 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
1d860 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
1d870 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
1d880 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1d890 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
1d8a0 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
1d8b0 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
1d8c0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
1d8d0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
1d8e0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
1d8f0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
1d900 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
1d910 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
1d920 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
1d930 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
1d940 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
1d950 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
1d960 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1d970 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
1d980 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1d990 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
1d9a0 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
1d9b0 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
1d9c0 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
1d9d0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
1d9e0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
1d9f0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
1da00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
1da10 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
1da20 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1da30 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1da40 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1da50 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1da60 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
1da70 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
1da80 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
1da90 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
1daa0 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
1dab0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
1dac0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
1dad0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1dae0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
1daf0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
1db00 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
1db10 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1db20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1db30 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1db40 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1db50 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1db60 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1db70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1db80 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1db90 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1dba0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1dbb0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1dbc0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1dbd0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1dbe0 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1dbf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1dc00 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1dc30 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1dc40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1dc50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1dc60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1dc70 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1dc80 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1dc90 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1dca0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1dcb0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1dcc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1dcd0 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1dce0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1dcf0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1dd00 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1dd10 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1dd20 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1dd30 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1dd40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
1dd50 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f  ;..  if( NEVER(o
1dd60 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
1dd70 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
1dd80 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  a) .   || &aPayl
1dd90 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1dda0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
1ddb0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
1ddc0 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
1ddd0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
1dde0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
1ddf0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1de00 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
1de10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1de20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1de30 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
1de40 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
1de50 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
1de60 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
1de70 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
1de80 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1de90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1dea0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
1deb0 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
1dec0 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
1ded0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1dee0 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
1def0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
1df00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1df10 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1df20 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
1df30 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
1df40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1df50 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1df60 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1df70 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1df80 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1df90 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1dfa0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1dfb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dfc0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1dfd0 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
1dfe0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1dff0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1e000 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1e010 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1e020 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1e030 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1e040 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1e050 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1e060 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1e070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1e080 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1e090 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1e0a0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1e0b0 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1e0c0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1e0d0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1e0e0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1e0f0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1e100 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1e110 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1e120 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1e130 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1e140 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1e150 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1e160 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e170 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1e180 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1e190 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1e1a0 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1e1b0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1e1c0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1e1d0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1e1e0 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1e1f0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1e200 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1e210 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1e220 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1e230 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1e240 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1e250 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1e260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1e270 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1e280 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1e290 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1e2a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e2b0 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1e2c0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
1e2d0 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
1e2e0 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c  ;.      /* nOvfl
1e2f0 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74   is always posit
1e300 69 76 65 2e 20 20 49 66 20 69 74 20 77 65 72 65  ive.  If it were
1e310 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c   zero, fetchPayl
1e320 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20  oad would have. 
1e330 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65       ** been use
1e340 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69  d instead of thi
1e350 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  s routine. */.  
1e360 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e      if( ALWAYS(n
1e370 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e  Ovfl) && !pCur->
1e380 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1e390 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e3a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1e3b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1e3c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1e3d0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
1e3e0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1e3f0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
1e400 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1e410 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
1e420 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
1e430 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
1e440 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
1e450 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e460 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1e470 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1e480 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
1e490 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
1e4a0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
1e4b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
1e4c0 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1e4d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
1e4e0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
1e4f0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
1e500 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1e510 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
1e520 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1e530 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
1e540 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
1e550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1e560 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
1e570 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
1e580 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
1e590 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1e5a0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
1e5b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1e5c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1e5d0 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
1e5e0 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
1e5f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1e600 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
1e610 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
1e620 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
1e630 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
1e640 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
1e650 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
1e660 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
1e670 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
1e680 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
1e690 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
1e6a0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1e6b0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
1e6c0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1e6d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1e6e0 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
1e6f0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
1e700 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
1e710 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
1e720 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
1e730 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
1e740 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
1e750 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
1e760 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
1e770 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
1e780 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
1e790 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
1e7a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e7b0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
1e7c0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1e7d0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1e7e0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1e7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1e800 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
1e810 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1e820 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
1e830 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
1e840 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
1e850 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
1e860 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
1e870 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
1e880 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
1e890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e8a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
1e8b0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1e8c0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
1e8d0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
1e8e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
1e8f0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
1e900 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
1e910 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
1e920 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
1e930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1e940 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
1e950 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
1e960 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
1e970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1e980 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
1e990 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
1e9a0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1e9b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
1e9d0 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
1e9e0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
1e9f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
1ea00 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1ea10 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
1ea20 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
1ea30 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
1ea40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1ea50 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
1ea60 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
1ea70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1ea80 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1ea90 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
1eaa0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
1eab0 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
1eac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1ead0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
1eae0 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
1eaf0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
1eb00 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
1eb10 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
1eb20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1eb30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1eb40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1eb50 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1eb60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eb70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1eb80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1eb90 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1eba0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
1ebb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1ebc0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1ebd0 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1ebe0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1ebf0 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1ec00 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1ec10 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1ec20 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
1ec30 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1ec40 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
1ec50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
1ec60 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
1ec70 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1ec80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ec90 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1eca0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1ecb0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1ecc0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1ecd0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1ece0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1ecf0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1ed00 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1ed10 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1ed20 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1ed30 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1ed40 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1ed50 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1ed60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ed70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ed80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ed90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1eda0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1edb0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1edc0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1edd0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1ede0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
1edf0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1ee00 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1ee10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1ee20 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
1ee30 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
1ee40 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1ee50 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
1ee60 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
1ee70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1ee80 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1ee90 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1eea0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1eeb0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1eec0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1eed0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1eee0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1eef0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1ef00 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1ef10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ef20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1ef30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1ef40 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1ef50 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1ef60 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1ef70 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1ef80 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1ef90 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1efa0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1efb0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1efc0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1efd0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1efe0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1eff0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1f000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1f010 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1f020 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f030 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1f040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f050 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1f060 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1f070 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f080 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1f090 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1f0a0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1f0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f0c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f0d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1f0e0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1f0f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1f100 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1f110 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f120 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1f130 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1f140 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1f150 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f160 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1f170 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1f180 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1f190 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1f1a0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1f1b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1f1c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f1d0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
1f1e0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1f1f0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
1f200 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
1f210 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
1f220 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
1f230 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1f240 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
1f250 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
1f260 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1f270 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
1f280 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
1f290 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
1f2a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
1f2b0 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
1f2c0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
1f2d0 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
1f2e0 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
1f2f0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1f300 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
1f310 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
1f320 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1f330 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
1f340 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
1f350 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
1f360 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
1f370 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
1f380 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
1f390 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
1f3a0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
1f3b0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
1f3c0 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
1f3d0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
1f3e0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
1f3f0 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
1f400 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
1f410 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
1f420 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
1f430 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
1f440 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1f450 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
1f460 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
1f470 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
1f480 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
1f490 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
1f4a0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
1f4b0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
1f4c0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1f4d0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
1f4e0 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
1f4f0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
1f500 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
1f510 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
1f520 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
1f530 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
1f540 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
1f550 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
1f560 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1f570 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1f580 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
1f590 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1f5a0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1f5b0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1f5c0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1f5d0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
1f5e0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1f5f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1f600 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1f610 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
1f620 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
1f630 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
1f640 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
1f650 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1f660 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1f670 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1f680 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1f690 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33    u32 nKey;.  u3
1f6a0 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  2 nLocal;..  ass
1f6b0 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
1f6c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1f6d0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1f6e0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1f6f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f700 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f710 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1f720 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f730 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
1f740 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1f750 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1f760 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f770 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f780 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1f790 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
1f7a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1f7b0 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  0) ){.    btreeP
1f7c0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1f7d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f7e0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1f7f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
1f820 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20   }.  aPayload = 
1f830 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1f840 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
1f850 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
1f860 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
1f870 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
1f880 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
1f890 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e  {.    nKey = (in
1f8a0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
1f8b0 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69  y;.  }.  if( ski
1f8c0 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79  pKey ){.    aPay
1f8d0 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
1f8e0 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
1f8f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e  >info.nLocal - n
1f900 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Key;.  }else{.  
1f910 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
1f920 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
1f930 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c    assert( nLocal
1f940 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20  <=nKey );.  }.  
1f950 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a  *pAmt = nLocal;.
1f960 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61    return aPayloa
1f970 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
1f980 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1f990 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
1f9a0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
1f9b0 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
1f9c0 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
1f9d0 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
1f9e0 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
1f9f0 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
1fa00 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
1fa10 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1fa20 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
1fa30 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
1fa40 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
1fa50 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
1fa60 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
1fa70 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
1fa80 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
1fa90 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
1faa0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
1fab0 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
1fac0 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
1fad0 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
1fae0 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
1faf0 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
1fb00 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
1fb10 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
1fb20 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
1fb30 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1fb40 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
1fb50 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
1fb60 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
1fb70 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
1fb80 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
1fb90 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
1fba0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
1fbb0 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
1fbc0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
1fbd0 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
1fbe0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1fbf0 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
1fc00 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
1fc10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1fc20 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1fc30 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1fc40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1fc50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1fc60 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
1fc70 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
1fc80 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1fc90 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
1fca0 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1fcb0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1fcc0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1fcd0 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn p;.}.const v
1fce0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1fcf0 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
1fd00 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1fd10 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
1fd20 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
1fd30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1fd40 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1fd50 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1fd60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1fd70 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1fd80 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
1fd90 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
1fda0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1fdb0 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
1fdc0 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1fdd0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1fde0 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
1fdf0 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn p;.}.../*.**
1fe00 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1fe10 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
1fe20 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
1fe30 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
1fe40 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
1fe50 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
1fe60 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
1fe70 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
1fe80 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1fe90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1fea0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
1feb0 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
1fec0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
1fed0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
1fee0 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
1fef0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
1ff00 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
1ff10 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
1ff20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
1ff30 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
1ff40 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
1ff50 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
1ff60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ff70 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
1ff80 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1ff90 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
1ffa0 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
1ffb0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
1ffc0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
1ffd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ffe0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
1fff0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20000 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20020 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20030 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
20040 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
20050 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
20060 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TH );.  if( pCur
20070 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
20080 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
20090 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
200a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
200b0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
200c0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
200d0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
200e0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
200f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
20100 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
20110 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
20120 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
20130 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
20140 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
20150 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
20160 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
20170 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
20180 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
20190 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
201a0 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
201b0 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
201c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
201d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
201e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
201f0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
20200 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61   NDEBUG./*.** Pa
20210 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
20220 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
20230 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
20240 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
20250 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
20260 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
20270 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
20280 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
20290 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
202a0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
202b0 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
202c0 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
202d0 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
202e0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
202f0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
20300 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
20310 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
20320 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
20330 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
20340 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
20350 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
20360 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
20370 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
20380 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
20390 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
203a0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
203b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
203c0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
203d0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
203e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
203f0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
20400 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
20410 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
20420 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
20430 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
20440 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
20450 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
20460 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
20470 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
20480 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
20490 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
204a0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
204b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
204c0 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
204d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
204e0 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
204f0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
20500 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
20510 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
20520 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
20530 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
20540 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
20550 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
20560 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
20570 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
20580 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
20590 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
205a0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
205b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
205c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
205d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
205e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
205f0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20600 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
20610 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20620 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20630 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
20640 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
20650 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20660 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
20670 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
20680 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
20690 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
206a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
206b0 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61  gno.  );.  relea
206c0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
206d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
206e0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
206f0 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
20700 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
20710 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
20720 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
20730 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
20740 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
20750 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
20760 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
20770 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
20780 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
20790 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
207a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
207b0 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
207c0 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
207d0 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
207e0 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
207f0 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
20800 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
20810 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
20820 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
20830 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
20840 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
20850 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
20860 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
20870 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
20880 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
20890 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
208a0 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
208b0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
208c0 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
208d0 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
208e0 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
208f0 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  D. Otherwise, th
20900 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20  e cursor is set 
20910 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20920 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f  first.** cell lo
20930 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
20940 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f  t (or virtual ro
20950 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65  ot) page and the
20960 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a   cursor state.**
20970 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
20980 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
20990 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
209a0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
209b0 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
209c0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
209d0 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
209e0 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
209f0 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
20a00 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
20a10 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
20a20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
20a30 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
20a40 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
20a50 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
20a60 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
20a70 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
20a80 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
20a90 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
20aa0 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
20ab0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
20ac0 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
20ad0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
20ae0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
20af0 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
20b00 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
20b10 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
20b20 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
20b30 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
20b40 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
20b50 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
20b60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
20b70 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
20b80 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
20b90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
20ba0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
20bb0 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
20bc0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
20bd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20be0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20bf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
20c00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
20c10 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20c20 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
20c30 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
20c40 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
20c50 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
20c60 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
20c70 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
20c80 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
20c90 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
20ca0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
20cb0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
20cc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
20cd0 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
20ce0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
20cf0 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
20d00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
20d10 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
20d20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20d30 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
20d40 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
20d50 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
20d60 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
20d70 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
20d80 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
20d90 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
20da0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
20db0 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
20dc0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
20dd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20de0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
20df0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
20e00 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
20e10 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69  pPage[0]);.    i
20e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e30 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
20e40 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
20e50 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
20e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
20e70 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
20e80 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
20e90 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
20ea0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
20eb0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
20ec0 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
20ed0 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
20ee0 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
20ef0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
20f00 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
20f10 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
20f20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
20f30 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
20f40 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
20f50 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
20f60 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
20f70 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
20f80 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
20f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
20fa0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
20fb0 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
20fc0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
20fd0 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
20fe0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
20ff0 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
21000 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
21010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21020 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21030 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
21040 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
21050 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
21060 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  of the correct t
21070 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62  ype. This must b
21080 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20  e the.  ** case 
21090 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  as the call to t
210a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
210b0 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f  t loaded the roo
210c0 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20  t-page (either. 
210d0 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72   ** this call or
210e0 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f   a previous invo
210f0 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61  cation) would ha
21100 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
21110 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20  uption .  ** if 
21120 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77  the assumption w
21130 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
21140 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
21150 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61  ible for the fla
21160 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f  gs .  ** byte to
21170 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
21180 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63  ied while this c
21190 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67  ursor is holding
211a0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a   a reference.  *
211b0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20  * to the page.  
211c0 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  */.  pRoot = pCu
211d0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
211e0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
211f0 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
21200 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
21210 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26   pRoot->isInit &
21220 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  & (pCur->pKeyInf
21230 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)==pRoot->in
21240 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d  tKey );..  pCur-
21250 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
21260 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21270 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
21280 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
21290 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
212a0 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
212b0 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
212c0 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
212d0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
212e0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
212f0 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
21300 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21310 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
21320 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
21330 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
21340 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
21350 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
21360 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
21370 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
21380 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
21390 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
213a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
213b0 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
213c0 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
213d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
213e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
213f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
21400 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
21410 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
21420 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
21430 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
21440 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
21450 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
21460 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
21470 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
21480 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
21490 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
214a0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
214b0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
214c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
214d0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
214e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
214f0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
21500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21510 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
21520 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
21530 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21540 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21550 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21560 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21570 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21580 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
21590 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
215a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
215b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
215c0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
215d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
215e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
215f0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
21600 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
21610 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21620 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
21630 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
21640 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
21650 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21660 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
21670 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
21680 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
21690 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
216a0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
216b0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
216c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
216d0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
216e0 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
216f0 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
21700 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
21710 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
21720 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
21730 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
21740 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
21750 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
21760 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
21770 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
21780 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
21790 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
217a0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
217b0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
217c0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
217d0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
217e0 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
217f0 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
21800 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
21810 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
21820 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
21830 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
21840 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
21850 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21860 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
21870 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
21880 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21890 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
218a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
218b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
218c0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
218d0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
218e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
218f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
21900 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
21910 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
21920 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
21930 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
21940 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
21950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
21960 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
21970 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
21980 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
21990 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
219a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
219b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
219c0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
219d0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
219e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
219f0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
21a00 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
21a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21a20 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
21a30 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
21a40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
21a50 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
21a60 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
21a70 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
21a80 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
21a90 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
21aa0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
21ab0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
21ac0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
21ad0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
21ae0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21af0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
21b00 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
21b10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
21b20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21b30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21b40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21b50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
21b60 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
21b70 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
21b80 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
21b90 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
21bb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21bc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
21bd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21be0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21bf0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
21c00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
21c10 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
21c20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21c40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21c50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21c60 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
21c70 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
21c80 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
21c90 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
21ca0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21cb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
21cc0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
21cd0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
21ce0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
21cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
21d00 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
21d10 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
21d20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
21d30 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
21d40 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
21d50 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
21d60 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
21d70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
21d80 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
21d90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
21da0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
21db0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
21dc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21dd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21de0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
21df0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
21e00 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
21e10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
21e20 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
21e30 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
21e40 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
21e50 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
21e60 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
21e70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
21e80 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
21e90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
21ea0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
21eb0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
21ec0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
21ed0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
21ee0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
21ef0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
21f00 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
21f10 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
21f20 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
21f30 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
21f40 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
21f50 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
21f60 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
21f70 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
21f80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21f90 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21fa0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
21fb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21fc0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
21fd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21fe0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21ff0 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
22000 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
22010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22020 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
22030 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
22040 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22050 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
22060 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
22070 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
22080 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22090 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
220a0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
220b0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
220c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
220d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
220e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
220f0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
22100 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
22110 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
22120 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
22130 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
22140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
22150 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
22160 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22170 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22180 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
22190 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
221a0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
221b0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
221c0 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
221d0 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
221e0 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
221f0 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
22200 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
22210 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
22220 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
22230 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
22240 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
22250 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
22260 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
22270 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
22280 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
22290 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
222a0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
222b0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
222c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
222d0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
222e0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
222f0 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
22300 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
22310 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
22320 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
22330 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
22340 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
22350 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
22360 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
22370 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
22380 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
22390 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
223a0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
223b0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
223c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
223d0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
223e0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
223f0 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
22400 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
22410 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
22420 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
22430 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
22440 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
22450 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
22460 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22470 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
22480 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
22490 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
224a0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
224d0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
224e0 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
224f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
22500 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
22510 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
22520 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
22530 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
22550 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
22560 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
22570 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
22580 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
22590 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
225a0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
225b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
225c0 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
225d0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
225e0 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
225f0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
22600 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
22610 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
22620 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
22630 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
22640 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22650 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
22660 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
22670 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
22680 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
22690 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
226a0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
226b0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
226c0 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
226d0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
226e0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
226f0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
22700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22710 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
22720 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
22730 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
22740 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22750 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22760 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22770 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
22780 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
22790 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
227a0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
227b0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
227c0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
227d0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
227e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
227f0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
22800 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
22810 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
22820 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
22830 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
22840 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
22850 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
22860 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22870 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
22880 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
22890 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
228a0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
228b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
228c0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
228d0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
228e0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
228f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22900 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
22910 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
22920 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
22930 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
22940 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
22950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
22960 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
22970 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
22980 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
229a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
229b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
229c0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
229d0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
229e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
229f0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
22a00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22a10 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
22a20 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  l>0 || pCur->eSt
22a30 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
22a40 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
22a50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22a60 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
22a70 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
22a80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22a90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22aa0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
22ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22ac0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
22ad0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22ae0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
22af0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
22b00 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
22b10 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
22b20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
22b30 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
22b40 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22b50 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
22b60 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  c;..    /* pPage
22b70 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
22b80 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
22b90 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
22ba0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
22bb0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
22bc0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
22bd0 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
22be0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
22bf0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
22c00 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
22c10 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
22c20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
22c30 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
22c40 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
22c50 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
22c60 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
22c70 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
22c80 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
22c90 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
22ca0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
22cb0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
22cc0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
22cd0 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
22ce0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
22cf0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
22d00 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
22d10 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
22d20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
22d30 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
22d40 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
22d50 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
22d60 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
22d70 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
22d80 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
22d90 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
22da0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
22db0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
22dc0 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
22dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
22de0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22df0 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
22e00 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
22e10 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
22e20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
22e30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22e40 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78  iPage]; /* Index
22e50 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   of current cell
22e60 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20   in pPage */.   
22e70 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e90 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22ea0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
22eb0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
22ec0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
22ed0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
22ee0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
22ef0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
22f00 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
22f10 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
22f20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
22f30 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
22f40 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
22f50 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
22f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
22f70 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
22f80 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
22f90 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64  arint32(pCell, d
22fa0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
22fb0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
22fc0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
22fd0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
22fe0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
22ff0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
23000 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
23010 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
23020 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
23030 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
23040 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
23050 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
23060 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e  ert( nCellKey>in
23070 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
23080 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
23090 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72    }.        pCur
230a0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
230b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
230c0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
230d0 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
230e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
230f0 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
23100 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
23110 33 32 37 36 38 20 62 79 74 65 73 2e 20 54 68 69  32768 bytes. Thi
23120 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
23130 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
23140 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
23150 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
23160 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
23170 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
23180 70 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20  page is at most 
23190 38 31 39 38 20 62 79 74 65 73 2c 20 77 68 69 63  8198 bytes, whic
231a0 68 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  h may be stored 
231b0 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
231c0 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
231d0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
231e0 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
231f0 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
23200 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
23210 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
23220 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
23230 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
23240 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
23250 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
23260 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
23270 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
23280 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
23290 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
232a0 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
232b0 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
232c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
232d0 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
232e0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
232f0 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26  (nCell & 0x80) &
23300 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  & nCell<=pPage->
23310 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
23320 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
23330 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
23340 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
23350 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
23360 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
23370 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
23380 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
23390 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
233a0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
233b0 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
233c0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
233d0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
233e0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
233f0 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
23400 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
23410 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
23420 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
23430 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
23440 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
23450 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
23460 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
23470 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
23480 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
23490 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
234a0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
234b0 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
234c0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
234d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
234e0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
234f0 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
23500 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
23510 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
23520 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23530 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
23540 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
23550 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
23560 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
23570 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
23580 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
23590 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
235a0 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
235b0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
235c0 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
235d0 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
235e0 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
235f0 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
23600 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
23610 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
23620 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
23630 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
23640 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
23650 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
23660 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
23670 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20  e called. */.   
23680 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
23690 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
236a0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
236b0 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
236c0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
236d0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ize;.          b
236e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
236f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
23700 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
23710 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
23720 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
23730 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
23740 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
23750 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
23760 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
23770 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
23780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
23790 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
237a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
237b0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
237c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
237d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
237e0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
237f0 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
23800 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
23810 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
23820 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
23830 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23840 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
23850 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
23860 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23870 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
23880 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
23890 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
238a0 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
238b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
238c0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
238d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
238e0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
238f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
23900 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
23910 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
23920 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
23930 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
23940 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
23950 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
23960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23970 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
23980 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
23990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
239a0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
239b0 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
239c0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
239d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
239e0 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
239f0 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
23a00 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
23a10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23a20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
23a30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
23a40 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
23a50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
23a60 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
23a70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23a80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
23a90 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
23aa0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
23ab0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
23ac0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
23ad0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
23ae0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
23af0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
23b00 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
23b10 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
23b20 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
23b30 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
23b40 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
23b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23b60 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
23b70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23b80 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23b90 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
23ba0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
23bb0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
23bc0 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
23bd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23be0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
23bf0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
23c00 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23c10 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
23c20 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
23c30 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
23c40 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
23c50 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
23c60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
23c70 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
23c80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23c90 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
23ca0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
23cb0 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
23cc0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
23cd0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
23ce0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
23cf0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
23d00 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
23d10 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
23d20 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
23d30 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
23d40 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
23d50 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
23d60 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
23d70 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
23d80 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
23d90 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
23da0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
23db0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
23dc0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
23dd0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
23de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
23df0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23e00 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
23e10 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
23e20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
23e30 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
23e40 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
23e50 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
23e60 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
23e70 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
23e80 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
23e90 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
23ea0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
23eb0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
23ec0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
23ed0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
23ee0 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
23ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
23f00 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
23f10 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
23f20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
23f30 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
23f40 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
23f50 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
23f60 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
23f70 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
23f80 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
23f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
23fa0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
23fb0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
23fc0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
23fd0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
23fe0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
23ff0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
24000 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
24010 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
24020 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
24030 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
24040 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24050 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
24060 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
24070 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
24080 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
240a0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
240b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
240c0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
240d0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
240e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
240f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24100 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
24110 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
24120 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
24130 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
24140 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
24150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24160 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
24170 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
24180 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24190 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
241a0 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
241b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
241c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
241d0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
241e0 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
241f0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
24200 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24210 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
24220 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
24230 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
24240 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
24250 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
24260 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24270 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
24280 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
24290 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
242a0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
242b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
242c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
242d0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
242e0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
242f0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
24300 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
24310 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
24320 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
24330 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
24340 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
24350 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24360 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
24370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24380 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
24390 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
243a0 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
243b0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
243c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
243d0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
243e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
243f0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
24400 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
24410 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
24420 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
24430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
24440 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
24450 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
24460 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24470 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
24480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24490 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
244a0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
244b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
244c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
244d0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
244e0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
244f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
24500 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
24510 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
24520 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
24530 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24540 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
24550 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
24560 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
24570 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
24580 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
24590 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
245a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
245b0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
245c0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
245d0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
245e0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
245f0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
24600 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
24610 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
24620 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
24630 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
24640 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24650 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24660 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
24670 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
24680 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
246a0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
246b0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
246c0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
246d0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
246e0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
246f0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
24700 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
24710 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
24720 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  ext<0 ){.    pCu
24730 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
24740 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
24750 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24760 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
24770 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
24780 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
24790 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
247a0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
247b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
247c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
247d0 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
247e0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
247f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
24800 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24810 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
24820 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
24830 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
24840 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
24850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24860 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
24870 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
24880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
24890 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
248a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
248b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
248c0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
248d0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
248e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
248f0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
24900 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
24910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24920 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
24930 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
24940 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
24950 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
24960 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
24970 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
24980 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
24990 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
249a0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
249b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
249c0 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
249d0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
249e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
249f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24a00 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
24a10 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
24a20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
24a30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
24a40 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
24a50 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
24a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
24a70 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
24a80 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
24a90 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
24aa0 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
24ab0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
24ac0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
24ad0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24ae0 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
24af0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
24b00 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
24b10 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
24b20 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
24b30 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
24b40 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
24b50 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
24b60 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
24b70 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
24b80 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
24b90 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
24ba0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
24bb0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24bc0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
24bd0 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
24be0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
24bf0 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
24c00 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
24c10 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
24c20 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
24c30 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
24c40 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
24c50 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
24c60 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
24c70 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
24c80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
24c90 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
24ca0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
24cb0 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
24cc0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
24cd0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
24ce0 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
24cf0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
24d00 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
24d10 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
24d20 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
24d30 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
24d40 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
24d50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24d60 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
24d70 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
24d80 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
24d90 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
24da0 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
24db0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
24dc0 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
24dd0 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
24de0 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
24df0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
24e00 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
24e10 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
24e20 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
24e30 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
24e40 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
24e50 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
24e60 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
24e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24e80 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
24e90 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
24ea0 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
24eb0 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
24ec0 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
24ed0 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
24ee0 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
24ef0 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
24f00 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
24f10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
24f20 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
24f30 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
24f40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24f50 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
24f60 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
24f70 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
24f80 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
24f90 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
24fa0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
24fb0 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
24fc0 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
24fd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24fe0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
24ff0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25000 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
25010 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
25020 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
25030 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
25040 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
25050 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
25060 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
25070 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
25080 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
25090 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
250a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
250b0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
250c0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
250d0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
250e0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
250f0 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
25100 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
25110 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
25120 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
25130 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
25140 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
25150 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
25160 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
25170 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
25180 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
25190 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
251a0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
251b0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
251c0 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
251d0 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
251e0 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
251f0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
25200 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
25210 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
25220 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
25230 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
25240 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25250 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
25260 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26      if( exact &&
25270 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
25280 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
25290 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
252a0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
252b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
252c0 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
252d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
252e0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
252f0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
25300 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25310 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
25320 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
25330 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
25340 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
25350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25360 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
25370 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
25380 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
25390 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
253a0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
253b0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
253c0 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
253d0 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
253e0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
253f0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
25400 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
25410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25420 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
25430 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
25440 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25450 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
25460 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
25470 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
25480 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
25490 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
254a0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
254b0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
254c0 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
254d0 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
254e0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
254f0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
25500 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
25510 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
25520 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
25530 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
25540 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
25550 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
25560 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
25570 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
25580 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
25590 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
255a0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
255b0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
255c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
255d0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
255e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
255f0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
25600 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
25610 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
25620 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
25630 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  k>mxPage ){.    
25640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25650 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25670 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
25680 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
25690 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
256a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
256b0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
256c0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
256d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
256e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
256f0 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
25700 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
25710 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
25720 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
25730 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
25740 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
25750 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
25760 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
25770 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
25780 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
25790 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
257a0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
257b0 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
257c0 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
257d0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
257e0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
257f0 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
25800 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
25810 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25820 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
25830 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
25840 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25850 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25860 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
25880 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
25890 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
258a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
258b0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
258c0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
258d0 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
258e0 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
258f0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
25900 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
25910 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
25920 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
25930 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
25940 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
25950 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
25960 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
25970 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
25980 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
25990 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
259a0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
259b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
259c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
259d0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
259e0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
259f0 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
25a00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25a10 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
25a20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
25a30 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
25a40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
25a50 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
25a60 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
25a70 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
25a80 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
25a90 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
25aa0 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
25ab0 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
25ac0 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
25ad0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
25ae0 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
25af0 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
25b00 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
25b10 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
25b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
25b30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25b40 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
25b50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
25b60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
25b70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25b80 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
25b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25ba0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
25bb0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
25bc0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
25bd0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
25be0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
25bf0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
25c00 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
25c10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
25c20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
25c30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
25c40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
25c50 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
25c60 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
25c70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
25c80 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
25c90 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
25ca0 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
25cb0 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
25cc0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
25cd0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
25ce0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
25cf0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
25d00 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
25d10 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
25d20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
25d30 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
25d40 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
25d50 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
25d60 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
25d70 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
25d80 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
25d90 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
25da0 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
25db0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25dc0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25dd0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
25de0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25df0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25e00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25e10 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
25e20 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
25e30 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
25e40 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
25e50 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
25e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25e70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25e80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
25e90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25ea0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
25eb0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
25ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25ed0 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
25ee0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
25ef0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
25f10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25f20 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
25f30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25f40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25f50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25f60 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
25f70 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
25f80 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
25f90 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
25fa0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
25fb0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
25fc0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
25fd0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
25fe0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
25ff0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
26000 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
26010 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
26020 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
26030 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
26040 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
26050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26060 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
26070 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
26080 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
26090 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
260a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
260b0 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
260c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
260d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
260e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
260f0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
26100 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26110 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
26120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
26130 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26140 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
26150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26160 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
26170 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
26180 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
26190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
261a0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
261b0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
261c0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
261d0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
261e0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
261f0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
26200 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
26210 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
26220 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
26230 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
26240 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
26250 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
26260 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
26270 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
26280 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
26290 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
262a0 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
262b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
262c0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
262d0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
262e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
262f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26300 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
26310 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
26320 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
26330 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
26340 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
26350 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
26360 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
26370 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
26380 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
26390 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
263a0 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
263b0 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
263c0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
263d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
263e0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
263f0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
26400 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
26410 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
26420 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
26430 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26440 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
26450 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
26460 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
26470 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
26480 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
264a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
264b0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
264c0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
264d0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
264e0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
264f0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
26500 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
26510 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
26520 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
26530 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
26540 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
26550 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
26560 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
26570 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
26580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26590 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
265a0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
265b0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
265c0 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
265d0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
265e0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
265f0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
26600 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
26610 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
26620 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
26630 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
26640 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
26650 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
26660 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
26670 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26680 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
26690 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
266a0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
266b0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
266c0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
266d0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
266e0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
266f0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
26700 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
26710 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
26720 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
26730 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
26740 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26750 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
26760 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
26770 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
26780 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
26790 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
267a0 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
267b0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
267c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
267d0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
267e0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
267f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26820 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
26830 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
26840 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26860 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
26870 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
26880 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26890 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
268a0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
268b0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
268c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
268d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
268e0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
268f0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
26900 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
26910 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
26920 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
26930 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
26940 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
26950 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
26960 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
26970 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
26980 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  e */.    int nPa
26990 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ge = pagerPageco
269a0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70  unt(pBt);.    *p
269b0 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
269c0 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e  ;..    if( *pPgn
269d0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
269e0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
269f0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
26a00 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
26a10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26a20 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
26a30 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
26a40 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
26a50 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20  t, *pPgno) ){.  
26a60 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
26a70 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
26a80 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
26a90 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
26aa0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
26ab0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
26ac0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
26ad0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
26ae0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
26af0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
26b00 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
26b10 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
26b20 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
26b30 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
26b40 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
26b50 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
26b60 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
26b70 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
26b80 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
26b90 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
26ba0 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
26bb0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
26bc0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26bd0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
26be0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
26bf0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50  pBt, *pPgno, &pP
26c00 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
26c10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26c20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
26c30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26c40 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
26c50 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
26c60 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
26c70 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
26c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26c90 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
26ca0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
26cb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26cc0 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e  E(pBt) ){ (*pPgn
26cd0 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  o)++; }.    }.#e
26ce0 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
26cf0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
26d00 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
26d10 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
26d20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
26d30 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30  pPgno, ppPage, 0
26d40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
26d50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
26d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26d70 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
26d80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
26d90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26da0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
26db0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
26dc0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
26dd0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
26de0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
26df0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
26e00 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
26e10 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
26e20 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
26e30 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
26e40 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
26e50 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
26e60 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
26e70 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
26e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e90 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
26ea0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
26eb0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
26ec0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
26ed0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
26ee0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26ef0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26f00 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
26f10 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
26f20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
26f30 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
26f40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26f50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
26f60 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
26f70 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
26f80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26f90 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
26fa0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
26fb0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
26fc0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
26fd0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
26fe0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
26ff0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
27000 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
27010 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
27020 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
27030 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
27040 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
27050 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
27060 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
27070 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
27080 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
27090 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
270a0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
270b0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
270c0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
270d0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
270e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
270f0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
27100 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
27110 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27120 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
27130 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
27140 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
27150 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
27160 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
27170 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
27180 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
27190 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
271a0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
271b0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271d0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
271e0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
271f0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
27220 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
27230 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
27240 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
27250 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
27260 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
27270 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
27280 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
27290 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
272a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
272b0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
272c0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
272d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
27300 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
27310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27330 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
27340 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
27350 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
27360 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27370 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
27380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
27390 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
273a0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
273b0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
273c0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
273d0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
273e0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
273f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
27400 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
27410 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
27420 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
27430 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
27440 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
27450 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
27460 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
27470 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
27480 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27490 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
274a0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
274b0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
274c0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
274d0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
274e0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
274f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
27500 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
27510 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53  ee+1);..#ifdef S
27520 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
27530 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ETE.  /* If the 
27540 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
27550 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  LETE compile-tim
27560 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
27570 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61  led, then.  ** a
27580 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
27590 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
275a0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
275b0 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eros..  */.  if(
275c0 20 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20   (!pPage && (rc 
275d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
275e0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
275f0 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20  e, 0))).   ||   
27600 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 73           (rc = s
27610 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27620 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
27630 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
27640 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27650 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  }.  memset(pPage
27660 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
27670 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
27680 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
27690 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
276a0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
276b0 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
276c0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
276d0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
276e0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
276f0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
27700 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
27710 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
27720 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
27730 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
27740 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
27750 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
27760 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
27770 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
27780 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
27790 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
277a0 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
277b0 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
277c0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
277d0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
277e0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
277f0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
27800 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
27810 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
27820 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
27830 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
27840 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
27850 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
27860 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
27870 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
27880 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
27890 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
278a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
278b0 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
278c0 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
278d0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
278e0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
278f0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
27900 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
27910 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
27920 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
27930 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
27940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27950 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
27960 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
27970 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
27980 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
27990 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
279a0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
279b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
279c0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
279d0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
279e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
279f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
27a00 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
27a10 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
27a20 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
27a30 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
27a40 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
27a50 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
27a60 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
27a70 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
27a80 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
27a90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
27aa0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
27ab0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27ac0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
27ad0 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
27ae0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
27af0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
27b00 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
27b10 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
27b20 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
27b30 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
27b40 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
27b50 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
27b60 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
27b70 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
27b80 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
27b90 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
27ba0 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
27bb0 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
27bc0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
27bd0 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
27be0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
27bf0 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
27c00 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
27c10 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
27c20 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
27c30 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
27c40 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
27c50 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
27c60 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
27c70 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
27c80 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
27c90 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
27ca0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
27cb0 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
27cc0 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
27cd0 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
27ce0 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
27cf0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
27d00 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
27d10 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
27d20 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
27d30 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
27d40 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
27d50 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
27d60 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
27d70 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
27d80 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
27d90 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
27da0 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
27db0 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
27dc0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
27dd0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
27de0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
27df0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
27e00 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
27e10 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
27e20 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
27e30 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
27e40 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
27e50 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
27e60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27e70 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27e80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
27e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27ea0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
27eb0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
27ec0 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
27ed0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
27ee0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
27ef0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
27f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
27f10 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
27f20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
27f30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
27f40 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
27f50 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27f60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
27f70 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d  dif.        rc =
27f80 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
27f90 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
27fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
27fb0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
27fc0 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
27fd0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
27fe0 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
27ff0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
28000 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
28010 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
28020 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
28030 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
28040 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
28050 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
28060 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
28070 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
28080 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
28090 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
280a0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
280b0 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
280c0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
280d0 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
280e0 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
280f0 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
28100 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
28110 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28120 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
28130 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
28140 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
28150 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
28160 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
28170 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
28180 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
28190 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
281a0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
281b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
281c0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
281d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
281e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
281f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28200 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
28210 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
28220 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28230 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
28240 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
28250 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
28260 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
28270 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
28280 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
28290 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
282a0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
282b0 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
282c0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
282d0 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
282e0 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
282f0 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
28300 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
28310 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
28320 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
28330 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
28340 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
28350 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
28360 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
28370 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
28380 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
28390 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
283a0 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
283b0 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
283c0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
283d0 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
283e0 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
283f0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
28400 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
28410 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
28420 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
28430 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
28440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
28450 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
28460 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
28470 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
28480 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
28490 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
284a0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
284b0 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
284c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
284d0 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
284e0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
284f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28500 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
28510 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
28520 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
28530 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
28540 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
28550 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
28560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28570 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
28580 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
28590 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
285a0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
285b0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
285c0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
285d0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
285e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
285f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
28600 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
28610 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
28620 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
28630 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
28640 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
28650 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
28660 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
28670 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
28680 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
28690 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
286a0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
286b0 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
286c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
286d0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
286e0 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
286f0 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63  lPgno>pagerPagec
28700 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
28710 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
28720 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
28730 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
28740 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
28750 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
28760 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
28770 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
28780 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
28790 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
287a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
287b0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
287c0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
287d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
287e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
287f0 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
28800 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
28810 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
28820 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
28830 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
28840 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
28850 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
28860 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
28870 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
28880 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
28890 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
288a0 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
288b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
288c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
288d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
288e0 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
288f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
28900 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28910 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
28920 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
28930 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
28940 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
28950 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
28960 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
28970 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
28980 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
28990 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
289a0 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
289b0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
289c0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
289d0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
289e0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
289f0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
28a00 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
28a10 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
28a20 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
28a30 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
28a40 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
28a50 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
28a60 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
28a70 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
28a80 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
28a90 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
28aa0 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
28ab0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
28ac0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
28ad0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
28ae0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
28af0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
28b00 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
28b10 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
28b20 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
28b30 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
28b40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
28b50 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
28b60 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
28b70 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
28b80 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
28b90 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
28ba0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
28bb0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
28bc0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
28bd0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
28be0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
28bf0 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
28c00 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
28c10 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
28c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28c30 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
28c40 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
28c50 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
28c60 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
28c70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28c80 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
28c90 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
28ca0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
28cb0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
28cc0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
28cd0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
28ce0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
28cf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
28d00 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
28d10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
28d20 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
28d30 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
28d40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
28d50 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
28d60 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
28d70 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
28d80 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
28d90 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
28da0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28db0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28dc0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
28dd0 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
28de0 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
28df0 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
28e00 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
28e10 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
28e20 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
28e30 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
28e40 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
28e50 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
28e60 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
28e70 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
28e80 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
28e90 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
28ea0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
28eb0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
28ec0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
28ed0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
28ee0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
28ef0 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
28f00 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28f10 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
28f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
28f30 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
28f40 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
28f50 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
28f60 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
28f70 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
28f80 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
28f90 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
28fa0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
28fb0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
28fc0 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
28fd0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
28fe0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
28ff0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
29000 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
29010 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
29020 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
29030 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
29040 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
29050 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
29060 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
29070 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
29080 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
29090 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
290a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
290b0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
290c0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
290d0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
290e0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
290f0 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
29100 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
29110 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
29120 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29130 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29140 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
29150 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
29160 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
29170 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
29180 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
29190 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
291a0 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
291b0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
291c0 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
291d0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
291e0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
291f0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
29200 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
29210 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
29220 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
29230 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
29240 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29250 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
29260 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
29270 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
29280 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
29290 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
292a0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
292b0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
292c0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
292d0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
292e0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
292f0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
29300 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
29310 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
29320 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
29330 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
29340 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
29350 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
29360 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
29370 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
29380 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
29390 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
293a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
293b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
293c0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
293d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
293e0 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
293f0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
29400 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
29410 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
29420 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
29430 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
29440 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29450 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
29460 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
29470 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
29480 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
29490 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
294a0 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
294b0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
294c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
294d0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
294e0 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
294f0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
29500 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
29510 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
29520 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
29530 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
29540 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
29550 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
29560 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
29570 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
29580 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
29590 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
295a0 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
295b0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
295c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
295d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
295e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
295f0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
29600 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
29610 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
29620 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
29630 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
29640 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
29650 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
29660 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
29670 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29680 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
29690 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
296a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
296b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
296c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
296d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
296e0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
296f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29700 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
29710 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
29720 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
29730 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
29740 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
29750 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
29760 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
29770 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
29780 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
29790 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
297a0 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
297b0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
297c0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
297d0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
297e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
297f0 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
29800 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
29810 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
29820 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
29830 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
29840 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
29850 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
29860 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
29870 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
29880 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
29890 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
298a0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
298b0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
298c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
298d0 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
298e0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
298f0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
29900 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
29910 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
29920 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
29930 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
29940 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
29950 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
29960 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
29970 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
29980 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
29990 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
299a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
299b0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
299c0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
299d0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
299e0 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
299f0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
29a00 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
29a10 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
29a20 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
29a30 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
29a40 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
29a50 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
29a60 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
29a70 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
29a80 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
29a90 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
29aa0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
29ab0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
29ac0 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
29ad0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
29ae0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
29af0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
29b00 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
29b10 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
29b20 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
29b30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
29b40 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
29b50 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
29b60 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
29b70 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
29b80 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
29b90 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29ba0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
29bb0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
29bc0 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
29bd0 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
29be0 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
29bf0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
29c00 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
29c10 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
29c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
29c30 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
29c40 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
29c50 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
29c60 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
29c70 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
29c80 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
29c90 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
29ca0 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
29cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
29cc0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
29cd0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
29ce0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
29cf0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
29d00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29d10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29d20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
29d30 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
29d40 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
29d50 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
29d60 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
29d70 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
29d80 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
29d90 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
29da0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
29db0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
29dc0 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
29dd0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
29de0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
29df0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
29e00 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
29e10 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
29e20 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
29e30 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
29e40 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
29e50 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
29e60 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
29e70 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
29e80 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
29e90 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b   *pRC){.  int i;
29ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
29eb0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
29ec0 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  nt pc;         /
29ed0 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
29ee0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
29ef0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
29f00 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
29f10 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
29f20 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
29f30 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
29f40 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
29f50 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
29f60 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
29f70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29f80 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
29f90 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
29fa0 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
29fb0 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
29fc0 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
29fd0 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
29fe0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
29ff0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2a000 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
2a010 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2a020 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2a030 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
2a040 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a050 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a060 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a080 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a090 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2a0a0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2a0b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2a0c0 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
2a0d0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2a0e0 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
2a0f0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2a100 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2a110 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2a120 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2a130 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2a140 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2a150 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2a160 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2a170 20 20 69 66 28 20 70 63 20 3c 20 67 65 74 32 62    if( pc < get2b
2a180 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2a190 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
2a1a0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2a1b0 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
2a1c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a1d0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
2a1e0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
2a1f0 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
2a200 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
2a210 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
2a220 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2a230 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
2a240 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2a250 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
2a260 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2a270 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
2a280 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
2a290 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2a2a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2a2b0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2a2c0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2a2d0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2a2e0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2a2f0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2a300 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2a310 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2a320 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2a330 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2a340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2a350 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2a360 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2a370 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2a380 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2a390 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2a3a0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2a3b0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2a3c0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2a3d0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2a3e0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2a3f0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2a400 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2a410 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2a420 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2a430 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2a440 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2a450 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2a460 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2a470 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2a480 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2a490 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2a4a0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2a4b0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2a4c0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2a4d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2a4e0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2a4f0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2a500 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2a510 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2a520 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2a530 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2a540 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2a550 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2a560 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2a570 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2a580 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2a590 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2a5a0 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2a5b0 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2a5c0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2a5d0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2a5e0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2a5f0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2a600 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2a610 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a620 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2a630 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2a640 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2a650 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2a660 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2a670 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2a680 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2a690 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2a6a0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2a6b0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2a6c0 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2a6d0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2a6e0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2a6f0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2a700 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2a710 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2a720 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2a730 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2a740 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2a750 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2a760 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2a770 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2a780 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2a790 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2a7a0 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2a7b0 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2a7c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
2a7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
2a7e0 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2a7f0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2a800 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2a810 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2a820 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a830 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2a840 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2a850 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2a860 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2a870 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2a880 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2a890 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2a8a0 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2a8b0 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2a8c0 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2a8d0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2a8e0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2a8f0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2a900 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2a910 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2a920 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2a930 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2a940 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2a950 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2a960 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2a970 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2a980 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  ata[] */..  int 
2a990 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2a9a0 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28  ? 4 : 0);..  if(
2a9b0 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2a9c0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
2a9d0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
2a9e0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
2a9f0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
2aa00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
2aa10 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2aa20 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2aa30 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
2aa40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2aa50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2aa60 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2aa70 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  aOvfl) );.  asse
2aa80 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2aa90 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2aaa0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2aab0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aac0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2aad0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
2aae0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2aaf0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2ab00 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2ab10 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2ab20 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2ab30 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2ab40 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2ab50 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2ab60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2ab70 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2ab80 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2ab90 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2aba0 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2abb0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2abc0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2abd0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
2abe0 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2abf0 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
2ac00 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2ac10 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
2ac20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
2ac30 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69  [j].idx = (u16)i
2ac40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2ac50 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2ac60 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2ac70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2ac80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ac90 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2aca0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2acb0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2acc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2acd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ace0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2acf0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2ad00 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2ad10 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2ad20 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2ad30 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2ad40 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ad50 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2ad60 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2ad70 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2ad80 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2ad90 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2ada0 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
2adb0 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
2adc0 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
2add0 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
2ade0 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
2adf0 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
2ae00 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
2ae10 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
2ae20 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
2ae30 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
2ae40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2ae50 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e  dx+sz <= pPage->
2ae60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2ae70 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
2ae80 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
2ae90 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
2aea0 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
2aeb0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
2aec0 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
2aed0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2aee0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2aef0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2af00 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
2af10 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ld);.    }.    f
2af20 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64  or(j=end, ptr=&d
2af30 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
2af40 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
2af50 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2af60 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
2af70 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
2af80 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
2af90 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
2afa0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
2afb0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
2afc0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
2afd0 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
2afe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2aff0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2b000 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
2b010 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2b020 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
2b030 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
2b040 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
2b050 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
2b060 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
2b070 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
2b080 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
2b090 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2b0a0 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
2b0b0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2b0c0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2b0d0 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
2b0e0 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2b0f0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
2b100 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
2b110 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
2b120 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
2b130 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
2b140 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
2b150 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
2b160 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2b170 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
2b180 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
2b190 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
2b1a0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
2b1b0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
2b1c0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
2b1d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
2b1e0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
2b1f0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2b200 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
2b210 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
2b220 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
2b230 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
2b240 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
2b250 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
2b260 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
2b270 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b280 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
2b290 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2b2a0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
2b2b0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
2b2c0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
2b2d0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2b2e0 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
2b2f0 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
2b300 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
2b310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b320 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
2b330 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
2b340 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
2b350 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
2b360 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2b370 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
2b380 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2b390 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
2b3a0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2b3b0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
2b3c0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
2b3d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b3e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2b3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b400 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b410 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2b420 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2b430 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
2b440 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2b450 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2b460 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
2b470 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
2b480 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b490 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2b4a0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2b4b0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2b4c0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
2b4d0 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
2b4e0 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
2b4f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2b500 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2b510 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
2b520 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
2b530 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
2b540 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
2b550 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43  >cellOffset + nC
2b560 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
2b570 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
2b580 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
2b590 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
2b5a0 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
2b5b0 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53    cellbody -= aS
2b5c0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ize[i];.    put2
2b5d0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
2b5e0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
2b5f0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
2b600 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
2b610 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a   aSize[i]);.  }.
2b620 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2b630 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
2b640 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2b650 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f  a[hdr+5], cellbo
2b660 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  dy);.  pPage->nF
2b670 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20  ree -= (nCell*2 
2b680 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c  + nUsable - cell
2b690 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2b6a0 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65  nCell = (u16)nCe
2b6b0 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
2b6c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
2b6d0 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
2b6e0 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
2b6f0 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
2b700 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
2b710 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2b720 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
2b730 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2b740 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
2b750 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
2b760 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
2b770 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2b780 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
2b790 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
2b7a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2b7b0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2b7c0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
2b7d0 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
2b7e0 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
2b7f0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
2b800 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
2b810 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
2b820 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
2b830 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
2b840 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
2b850 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
2b860 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
2b870 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
2b880 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
2b890 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
2b8a0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
2b8b0 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
2b8c0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
2b8d0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
2b8e0 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
2b8f0 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
2b900 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
2b910 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
2b920 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
2b930 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b940 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
2b950 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
2b960 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
2b970 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
2b980 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
2b990 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
2b9a0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
2b9b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b9c0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
2b9d0 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
2b9e0 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
2b9f0 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
2ba00 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
2ba10 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
2ba20 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
2ba30 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
2ba40 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
2ba50 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
2ba60 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
2ba70 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
2ba80 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2ba90 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
2baa0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2bab0 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
2bac0 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
2bad0 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
2bae0 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
2baf0 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
2bb00 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
2bb10 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
2bb20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
2bb30 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
2bb40 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
2bb50 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
2bb60 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
2bb70 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
2bb80 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
2bb90 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
2bba0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
2bbb0 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
2bbc0 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
2bbd0 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
2bbe0 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
2bbf0 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
2bc00 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
2bc10 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
2bc20 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
2bc30 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
2bc40 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
2bc50 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
2bc60 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
2bc70 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
2bc80 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
2bc90 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
2bca0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
2bcb0 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
2bcc0 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
2bcd0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
2bce0 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
2bcf0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
2bd00 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
2bd10 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
2bd20 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
2bd30 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2bd40 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
2bd50 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
2bd60 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
2bd70 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
2bd80 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
2bd90 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
2bda0 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
2bdb0 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
2bdc0 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
2bdd0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
2bde0 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
2bdf0 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
2be00 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
2be10 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
2be20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2be30 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
2be40 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
2be50 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
2be60 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2be70 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
2be80 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
2be90 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2beb0 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
2bec0 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
2bed0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2bf00 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
2bf10 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf30 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2bf40 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
2bf50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2bf60 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2bf70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2bf80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2bf90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2bfa0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2bfb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2bfc0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
2bfd0 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
2bfe0 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74  ->nCell<=0 ) ret
2bff0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2c000 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
2c010 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2c020 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
2c030 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
2c040 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
2c050 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
2c060 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c070 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
2c080 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
2c090 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
2c0a0 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
2c0b0 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
2c0c0 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
2c0d0 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
2c0e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
2c0f0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2c100 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2c110 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
2c120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c130 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
2c140 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
2c150 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
2c160 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
2c170 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a  Cell;.    u16 sz
2c180 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
2c190 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c1a0 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
2c1b0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
2c1c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c1d0 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
2c1e0 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
2c1f0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
2c200 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
2c210 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2c220 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
2c230 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
2c240 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2c250 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
2c260 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2c270 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
2c280 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
2c290 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2c2a0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2c2b0 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2c2c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
2c2d0 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
2c2e0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2c2f0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
2c300 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
2c310 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
2c320 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
2c330 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2c340 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
2c350 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2c360 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
2c370 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
2c380 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
2c390 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
2c3a0 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
2c3b0 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
2c3c0 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
2c3d0 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
2c3e0 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
2c3f0 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
2c400 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
2c410 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
2c420 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2c430 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
2c440 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
2c450 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
2c460 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
2c470 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
2c480 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2c490 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2c4a0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c4b0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
2c4c0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2c4d0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2c4e0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
2c4f0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
2c500 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
2c510 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
2c520 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2c530 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
2c540 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2c550 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2c560 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2c570 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2c580 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2c590 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2c5a0 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2c5b0 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2c5c0 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2c5d0 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2c5e0 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2c5f0 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2c600 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2c610 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2c620 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2c630 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2c640 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2c650 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2c660 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2c670 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2c680 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2c690 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2c6a0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2c6b0 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2c6c0 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2c6d0 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2c6e0 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2c6f0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2c700 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2c710 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2c720 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2c730 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2c740 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2c750 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2c760 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2c770 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2c780 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2c790 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2c7a0 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2c7b0 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2c7c0 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2c7d0 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2c7e0 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2c7f0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2c800 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2c810 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2c820 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2c830 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2c840 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c850 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2c860 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2c870 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2c880 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2c890 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2c8a0 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2c8b0 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2c8c0 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2c8d0 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2c8e0 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2c8f0 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2c900 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2c910 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2c920 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2c930 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2c940 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
2c950 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
2c960 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2c970 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2c980 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
2c990 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
2c9a0 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
2c9b0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
2c9c0 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
2c9d0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2c9e0 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
2c9f0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2ca00 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2ca10 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2ca20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
2ca30 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
2ca40 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
2ca50 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
2ca60 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
2ca70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ca80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2ca90 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2caa0 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
2cab0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2cac0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
2cad0 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
2cae0 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2caf0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
2cb00 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
2cb10 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
2cb20 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
2cb30 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
2cb40 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
2cb50 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
2cb60 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
2cb70 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
2cb80 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
2cb90 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
2cba0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
2cbb0 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
2cbc0 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
2cbd0 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
2cbe0 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
2cbf0 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
2cc00 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
2cc10 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2cc20 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
2cc30 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2cc40 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
2cc50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
2cc60 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
2cc70 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2cc80 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
2cc90 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
2cca0 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
2ccb0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2ccc0 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
2ccd0 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
2cce0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
2ccf0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
2cd00 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
2cd10 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2cd20 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2cd30 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
2cd40 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2cd50 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2cd60 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2cd70 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
2cd80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cd90 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2cda0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2cdb0 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2cdc0 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
2cdd0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2cde0 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2cdf0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2ce00 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2ce10 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2ce20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ce30 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2ce40 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
2ce50 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2ce60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ce70 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ce80 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
2ce90 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2cea0 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2ceb0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2cec0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2ced0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2cee0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2cef0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
2cf00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2cf10 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
2cf20 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
2cf30 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
2cf40 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
2cf50 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
2cf60 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
2cf70 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
2cf80 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
2cf90 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
2cfa0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
2cfb0 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
2cfc0 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
2cfd0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
2cfe0 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
2cff0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
2d000 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
2d010 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
2d020 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
2d030 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
2d040 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
2d050 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2d060 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
2d070 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
2d080 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
2d090 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
2d0a0 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
2d0b0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
2d0c0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
2d0d0 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
2d0e0 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
2d0f0 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
2d100 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79  ge.aOvfl[] array
2d110 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
2d120 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
2d130 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
2d140 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
2d150 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
2d160 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
2d170 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
2d180 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
2d190 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2d1a0 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
2d1b0 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
2d1c0 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
2d1d0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
2d1e0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
2d1f0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
2d200 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
2d210 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
2d220 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
2d230 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
2d240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d250 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2d260 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
2d270 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
2d280 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2d290 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2d2a0 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
2d2b0 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
2d2c0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
2d2d0 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
2d2e0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
2d2f0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2d300 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
2d310 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2d320 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
2d330 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
2d340 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
2d350 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
2d360 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
2d370 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 69 6e 74      TESTONLY(int
2d380 20 72 63 3b 29 0a 20 20 20 20 69 6e 74 20 69 44   rc;).    int iD
2d390 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61  ata;.  .  .    a
2d3a0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
2d3b0 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65  Init );.    asse
2d3c0 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65  rt( pFrom->nFree
2d3d0 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20  >=iToHdr );.    
2d3e0 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2d3f0 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
2d400 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c  +5])<=pBt->usabl
2d410 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
2d420 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
2d430 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
2d440 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
2d450 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
2d460 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
2d470 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2d480 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
2d490 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
2d4a0 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
2d4b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2d4c0 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
2d4d0 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
2d4e0 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
2d4f0 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
2d500 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
2d510 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
2d520 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
2d530 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
2d540 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d550 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
2d560 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
2d570 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
2d580 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
2d590 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e  tion of pTo "can
2d5a0 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68  not" fail, as th
2d5b0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 63 6f  e.    ** data co
2d5c0 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20  pied from pFrom 
2d5d0 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  is known to be v
2d5e0 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 20 20 70 54  alid.  */.    pT
2d5f0 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2d600 20 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d     TESTONLY(rc =
2d610 20 29 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   ) btreeInitPage
2d620 28 70 54 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  (pTo);.    asser
2d630 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2d640 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66   );.  .    /* If
2d650 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2d660 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2d670 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2d680 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2d690 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
2d6a0 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
2d6b0 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
2d6c0 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
2d6d0 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
2d6e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2d6f0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2d700 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
2d710 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
2d720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2d730 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d740 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
2d750 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
2d760 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
2d770 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
2d780 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
2d790 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
2d7a0 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
2d7b0 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
2d7c0 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
2d7d0 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
2d7e0 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
2d7f0 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
2d800 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
2d810 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
2d820 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
2d830 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
2d840 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
2d850 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
2d860 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
2d870 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
2d880 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
2d890 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
2d8a0 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
2d8b0 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
2d8c0 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
2d8d0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
2d8e0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
2d8f0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
2d900 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
2d910 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
2d920 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
2d930 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
2d940 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
2d950 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2d960 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
2d970 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
2d980 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
2d990 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
2d9a0 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
2d9b0 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
2d9c0 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
2d9d0 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
2d9e0 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
2d9f0 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
2da00 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
2da10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2da20 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
2da30 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
2da40 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
2da50 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
2da60 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
2da70 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
2da80 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
2da90 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
2daa0 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
2dab0 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
2dac0 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
2dad0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
2dae0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2daf0 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
2db00 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
2db10 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2db20 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
2db30 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
2db40 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2db50 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
2db60 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
2db70 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
2db80 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
2db90 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
2dba0 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
2dbb0 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
2dbc0 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
2dbd0 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
2dbe0 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
2dbf0 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
2dc00 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2dc10 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2dc20 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
2dc30 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
2dc40 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
2dc50 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
2dc60 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
2dc70 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
2dc80 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
2dc90 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
2dca0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
2dcb0 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
2dcc0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
2dcd0 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
2dce0 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
2dcf0 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
2dd00 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
2dd10 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
2dd20 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
2dd30 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2dd40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2dd50 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
2dd60 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
2dd70 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
2dd80 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
2dd90 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
2dda0 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2ddb0 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2ddc0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
2ddd0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
2dde0 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
2ddf0 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
2de00 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2de10 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
2de20 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2de30 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2de40 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2de50 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2de60 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2de70 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2de80 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2de90 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2dea0 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2deb0 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2dec0 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2ded0 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2dee0 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2def0 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2df00 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2df10 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2df20 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2df30 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2df40 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2df50 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2df60 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2df70 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2df80 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2df90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2dfa0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2dfb0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2dfc0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2dfe0 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2dff0 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2e000 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2e010 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e030 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2e040 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2e050 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2e060 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2e070 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2e080 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2e090 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2e0a0 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20  */.  int isRoot 
2e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e0d0 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
2e0e0 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42  t-page */.){.  B
2e0f0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2e100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2e110 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
2e120 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
2e130 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e140 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e150 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2e160 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
2e170 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
2e180 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
2e190 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
2e1a0 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
2e1b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
2e1c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e1d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e1e0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
2e1f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
2e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e210 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e220 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
2e230 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
2e240 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2e250 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2e260 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
2e270 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
2e280 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
2e290 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
2e2a0 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
2e2b0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2e2c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e2d0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2e2e0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
2e2f0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
2e300 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
2e310 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2e320 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
2e330 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
2e340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e350 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
2e360 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
2e370 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
2e380 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
2e390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2e3a0 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
2e3b0 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
2e3c0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
2e3d0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2e3e0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
2e3f0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
2e400 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e420 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
2e430 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
2e440 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
2e450 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
2e460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2e470 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2e480 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
2e490 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
2e4a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
2e4b0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2e4c0 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
2e4d0 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
2e4e0 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
2e4f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2e500 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2e510 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
2e520 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
2e530 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
2e540 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
2e550 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
2e560 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
2e570 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
2e580 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
2e590 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
2e5a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2e5b0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
2e5c0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2e5d0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
2e5e0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
2e5f0 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
2e600 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e610 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
2e620 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
2e630 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
2e640 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
2e650 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
2e660 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
2e670 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2e680 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
2e690 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2e6a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
2e6b0 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
2e6c0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
2e6d0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
2e6e0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2e6f0 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
2e700 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
2e710 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
2e720 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
2e730 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e740 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
2e750 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
2e760 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e780 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2e790 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2e7a0 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
2e7b0 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
2e7c0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2e7d0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
2e7e0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
2e7f0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e810 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
2e820 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
2e830 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
2e840 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
2e850 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e860 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2e870 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2e880 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2e890 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2e8a0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2e8b0 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
2e8c0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
2e8d0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
2e8e0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
2e8f0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
2e900 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
2e910 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2e920 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
2e930 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
2e940 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
2e950 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
2e960 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
2e970 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
2e980 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
2e990 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
2e9a0 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
2e9b0 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
2e9c0 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
2e9d0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
2e9e0 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
2e9f0 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
2ea00 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
2ea10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2ea20 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2ea30 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2ea40 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2ea50 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2ea60 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2ea70 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2ea80 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2ea90 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2eaa0 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2eab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2eac0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2ead0 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2eae0 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2eaf0 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2eb00 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2eb10 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2eb20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2eb30 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2eb40 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2eb50 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2eb60 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2eb70 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2eb80 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2eb90 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2eba0 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2ebb0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2ebc0 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2ebd0 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2ebe0 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2ebf0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2ec00 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2ec10 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2ec20 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2ec30 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2ec40 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2ec50 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2ec60 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2ec70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ec80 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2ec90 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2eca0 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2ecb0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2ecc0 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2ecd0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2ece0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2ecf0 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61  page, since if a
2ed00 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20  ny existed they 
2ed10 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61  will.  ** have a
2ed20 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f  lready been remo
2ed30 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20  ved..  */.  i = 
2ed40 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ed50 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
2ed60 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
2ed70 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
2ed80 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b  .    nOld = i+1;
2ed90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
2eda0 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20  ld = 3;.    if( 
2edb0 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
2ede0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2edf0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
2ee00 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2ee10 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i-2;.    }else{.
2ee20 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
2ee30 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
2ee40 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d  }.    i = 2;.  }
2ee50 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
2ee60 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ee70 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
2ee80 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
2ee90 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
2eea0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2eeb0 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
2eec0 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
2eed0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
2eee0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2eef0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
2ef00 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
2ef10 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
2ef20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
2ef30 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2ef40 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
2ef50 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
2ef60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2ef70 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
2ef80 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
2ef90 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
2efa0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2efb0 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2efc0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
2efd0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
2efe0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
2eff0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
2f000 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
2f010 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
2f020 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2f030 5d 2e 69 64 78 20 26 26 20 70 50 61 72 65 6e 74  ].idx && pParent
2f040 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2f050 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2f060 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2f070 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
2f080 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2f090 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2f0a0 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2f0b0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2f0c0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2f0d0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2f0e0 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
2f0f0 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
2f100 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2f110 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2f120 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2f130 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
2f140 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2f150 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2f160 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2f170 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2f180 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
2f190 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
2f1a0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2f1b0 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
2f1c0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
2f1d0 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
2f1e0 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
2f1f0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
2f200 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
2f210 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
2f220 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
2f230 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
2f240 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2f250 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2f260 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2f270 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
2f280 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2f290 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
2f2a0 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2f2b0 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
2f2c0 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
2f2d0 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
2f2e0 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
2f2f0 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
2f300 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
2f310 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
2f320 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
2f330 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
2f340 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
2f350 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
2f360 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
2f370 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
2f380 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
2f390 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
2f3a0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
2f3b0 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
2f3c0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
2f3d0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
2f3e0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
2f3f0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
2f400 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
2f410 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
2f420 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
2f430 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
2f440 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  d.  */.#ifdef SQ
2f450 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
2f460 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  TE.      memcpy(
2f470 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2f480 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2f490 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  ata], apDiv[i], 
2f4a0 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
2f4b0 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
2f4c0 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2f4d0 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2f4e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  ;.#endif.      d
2f4f0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2f500 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2f510 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
2f520 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ew[i], &rc);.   
2f530 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
2f540 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2f550 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2f560 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2f570 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2f580 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2f590 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2f5a0 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2f5b0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2f5c0 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2f5d0 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2f5e0 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65  .  k = pBt->page
2f5f0 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69  Size + ROUND8(si
2f600 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2f610 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
2f620 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
2f630 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
2f660 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
2f670 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f690 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
2f6a0 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2f6b0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6d0 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2f6e0 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20      + k*nOld;   
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f710 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73    /* Page copies
2f720 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61   (apCopy) */.  a
2f730 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
2f740 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
2f750 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
2f760 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
2f770 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2f780 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
2f790 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2f7a0 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
2f7b0 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
2f7c0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63  xCells];.  aSpac
2f7d0 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  e1 = (u8*)&szCel
2f7e0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
2f7f0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2f800 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70  TE_ALIGNMENT(aSp
2f810 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  ace1) );..  /*. 
2f820 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
2f830 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
2f840 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
2f850 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
2f860 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2f870 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
2f880 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
2f890 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
2f8a0 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
2f8b0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
2f8c0 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65  ined from aSpace
2f8d0 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
2f8e0 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
2f8f0 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
2f900 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
2f910 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
2f920 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
2f930 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
2f940 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
2f950 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
2f960 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
2f970 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
2f980 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
2f990 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
2f9a0 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
2f9b0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
2f9c0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2f9d0 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
2f9e0 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
2f9f0 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
2fa00 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
2fa10 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
2fa20 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
2fa30 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
2fa40 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
2fa50 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
2fa60 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
2fa70 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
2fa80 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
2fa90 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
2faa0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
2fab0 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
2fac0 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
2fad0 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
2fae0 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
2faf0 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
2fb00 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
2fb10 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
2fb20 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
2fb30 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
2fb40 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
2fb50 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
2fb60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
2fb70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
2fb80 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
2fb90 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
2fba0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
2fbb0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2fbc0 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
2fbd0 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
2fbe0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
2fbf0 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
2fc00 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
2fc10 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
2fc20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
2fc30 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
2fc40 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
2fc50 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
2fc60 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
2fc70 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
2fc80 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
2fc90 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
2fca0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
2fcb0 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
2fcc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
2fcd0 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
2fce0 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
2fcf0 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
2fd00 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
2fd10 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
2fd20 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
2fd30 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
2fd40 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
2fd50 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
2fd60 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
2fd70 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
2fd80 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
2fd90 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
2fda0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2fdb0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
2fdc0 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
2fdd0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
2fde0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
2fdf0 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
2fe00 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
2fe10 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
2fe20 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
2fe30 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2fe40 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
2fe50 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
2fe60 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
2fe70 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
2fe80 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
2fe90 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
2fea0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
2feb0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
2fec0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
2fed0 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
2fee0 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
2fef0 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
2ff00 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
2ff10 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2ff20 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
2ff30 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d  ssert( iSpace1<=
2ff40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
2ff50 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
2ff60 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
2ff70 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c  z);.      apCell
2ff80 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
2ff90 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2ffa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2ffb0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2ffc0 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
2ffd0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a  n==4 );.      sz
2ffe0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2fff0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65  Cell[nCell] - le
30000 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
30010 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
30020 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61  eaf ){.        a
30030 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
30040 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
30050 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
30060 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
30070 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
30080 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
30090 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
300a0 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
300b0 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  e left.        *
300c0 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
300d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
300e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
300f0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
30100 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pOld->aData[8], 
30110 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
30120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30130 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
30140 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =4 );.        if
30150 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
30160 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
30170 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
30180 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
30190 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
301a0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  /.          szCe
301b0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
301c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
301d0 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
301e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
301f0 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
30200 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
30210 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
30220 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
30230 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
30240 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
30250 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
30260 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
30270 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
30280 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
30290 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
302a0 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
302b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
302c0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
302d0 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
302e0 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
302f0 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
30300 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
30310 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
30320 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
30330 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
30340 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
30350 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
30360 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
30370 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
30380 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
30390 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
303a0 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
303b0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
303c0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
303d0 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
303e0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
303f0 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
30400 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
30410 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
30420 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
30430 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
30440 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
30450 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
30460 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
30470 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
30480 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
30490 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
304a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
304b0 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
304c0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
304d0 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
304e0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
304f0 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
30500 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
30510 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
30520 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
30530 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
30540 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
30550 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
30560 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
30570 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
30580 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
30590 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
305a0 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
305b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
305c0 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b  .      if( k>NB+
305d0 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  1 ){ rc = SQLITE
305e0 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20 62  _CORRUPT; goto b
305f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
30600 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
30610 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
30620 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
30630 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
30640 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
30650 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
30660 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
30670 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
30680 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
30690 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
306a0 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
306b0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
306c0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
306d0 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
306e0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
306f0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
30700 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
30710 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
30720 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
30730 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
30740 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
30750 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
30760 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
30770 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
30780 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
30790 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
307a0 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
307b0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
307c0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
307d0 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
307e0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
307f0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
30800 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
30810 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
30820 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
30830 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
30840 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
30850 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
30860 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
30870 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
30880 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
30890 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
308a0 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
308b0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
308c0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
308d0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
308e0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
308f0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
30900 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
30910 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
30920 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
30930 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
30940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
30950 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
30960 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
30970 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
30980 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
30990 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
309a0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
309b0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
309c0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
309d0 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
309e0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
309f0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
30a00 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
30a10 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
30a20 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
30a30 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
30a40 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
30a50 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
30a60 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
30a70 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
30a80 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
30a90 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
30aa0 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
30ab0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
30ac0 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
30ad0 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
30ae0 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
30af0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
30b00 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
30b10 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
30b20 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
30b30 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
30b40 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
30b50 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
30b60 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
30b70 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
30b80 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
30b90 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
30ba0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
30bb0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
30bc0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
30bd0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
30be0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
30bf0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
30c00 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
30c10 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
30c20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
30c30 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
30c40 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
30c50 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
30c60 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
30c70 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
30c80 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
30c90 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
30ca0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
30cb0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
30cc0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
30cd0 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
30ce0 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
30cf0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30d00 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  T;.    goto bala
30d10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
30d20 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61  .  pageFlags = a
30d30 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30  pOld[0]->aData[0
30d40 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
30d50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
30d60 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
30d70 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
30d80 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
30d90 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
30da0 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
30db0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
30dc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30dd0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
30de0 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
30df0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
30e00 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
30e10 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
30e20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
30e30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
30e40 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
30e50 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
30e60 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  no, pgno, 0);.  
30e70 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
30e80 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
30e90 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
30ea0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
30eb0 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
30ec0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
30ed0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
30ee0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
30ef0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
30f00 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
30f10 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
30f20 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
30f30 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
30f40 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
30f50 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
30f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30f80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30f90 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
30fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30fb0 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
30fc0 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
30fd0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
30fe0 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
30ff0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
31000 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
31010 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
31020 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31030 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31040 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
31050 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
31060 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
31070 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
31080 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
31090 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
310a0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
310b0 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
310c0 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
310d0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
310e0 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
310f0 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
31100 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
31110 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
31120 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
31130 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
31140 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
31150 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
31160 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
31170 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
31180 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
31190 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
311a0 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
311b0 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
311c0 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
311d0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
311e0 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
311f0 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
31200 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
31210 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
31220 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
31230 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
31240 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
31250 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
31260 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
31270 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
31280 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
31290 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
312a0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
312b0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
312c0 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
312d0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
312e0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
312f0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
31300 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
31310 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
31320 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
31330 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
31340 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
31350 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
31360 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31370 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
31380 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
31390 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
313a0 0a 20 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77  .      t = apNew
313b0 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [i]->pgno;.     
313c0 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
313d0 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
313e0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
313f0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
31400 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
31410 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
31420 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
31430 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
31440 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
31450 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
31460 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
31470 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
31480 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
31490 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
314a0 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
314b0 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
314c0 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
314d0 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
314e0 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
314f0 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
31500 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
31510 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
31520 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
31530 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
31540 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
31550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31560 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31570 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
31580 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
31590 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
315a0 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
315b0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
315c0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
315d0 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
315e0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
315f0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
31600 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
31610 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
31620 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
31630 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
31640 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
31650 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
31660 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
31670 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
31680 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
31690 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
316a0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
316b0 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
316c0 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
316d0 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
316e0 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
316f0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
31700 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
31710 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
31720 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
31730 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
31740 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
31750 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
31760 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
31770 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
31780 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
31790 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
317a0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
317b0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
317c0 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
317d0 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
317e0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
317f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
31800 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
31810 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
31820 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
31830 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
31840 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
31850 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
31860 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
31870 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
31880 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31890 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
318a0 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
318b0 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
318c0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
318d0 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c    pTemp = &aOvfl
318e0 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65  Space[iOvflSpace
318f0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
31900 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
31910 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
31920 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
31930 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
31940 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
31950 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
31960 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
31970 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
31980 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
31990 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
319a0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
319b0 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
319c0 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
319d0 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
319e0 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
319f0 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
31a00 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
31a10 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
31a20 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
31a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
31a40 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
31a50 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
31a60 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
31a70 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
31a80 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
31a90 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
31aa0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
31ab0 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
31ac0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
31ad0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
31ae0 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
31af0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
31b00 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
31b10 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
31b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31b30 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
31b40 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
31b50 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
31b60 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
31b70 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
31b80 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
31b90 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
31ba0 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
31bb0 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
31bc0 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
31bd0 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
31be0 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
31bf0 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
31c00 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
31c10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
31c20 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e btreeParseCell
31c30 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
31c40 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
31c50 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
31c60 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
31c70 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
31c80 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72  to pass the corr
31c90 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20  ect size to .   
31ca0 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65       ** insertCe
31cb0 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65  ll(), so reparse
31cc0 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20   the cell now.. 
31cd0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31ce0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
31cf0 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61  his can never ha
31d00 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74  ppen in an SQLit
31d10 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20  e data file, as 
31d20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  all.        ** c
31d30 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73  ells are at leas
31d40 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e  t 4 bytes. It on
31d50 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d  ly happens in b-
31d60 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20  trees used.     
31d70 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74     ** to evaluat
31d80 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  e "IN (SELECT ..
31d90 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20  .)" and similar 
31da0 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
31db0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
31dc0 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a  szCell[j]==4 ){.
31dd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31de0 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d  (leafCorrection=
31df0 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  =4);.          s
31e00 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
31e10 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b  pParent, pCell);
31e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31e30 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70   }.      iOvflSp
31e40 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
31e50 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
31e60 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
31e70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
31e80 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  vflSpace<=pBt->p
31e90 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
31ea0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
31eb0 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
31ec0 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
31ed0 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
31ee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31ef0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
31f00 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
31f10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
31f20 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31f30 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
31f40 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
31f50 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
31f60 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
31f70 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
31f80 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
31f90 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
31fa0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
31fb0 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
31fc0 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
31fd0 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20  .    u8 *zChild 
31fe0 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  = &apCopy[nOld-1
31ff0 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20  ]->aData[8];.   
32000 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
32010 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
32020 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20  , zChild, 4);.  
32030 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20  }..  if( isRoot 
32040 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
32050 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d  l==0 && pParent-
32060 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65  >hdrOffset<=apNe
32070 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  w[0]->nFree ){. 
32080 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
32090 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
320a0 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e  e now contains n
320b0 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c  o cells. The onl
320c0 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  y sibling.    **
320d0 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67   page is the rig
320e0 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
320f0 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65  parent. Copy the
32100 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
32110 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61  .    ** child pa
32120 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ge into the pare
32130 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74  nt, decreasing t
32140 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68  he overall heigh
32150 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
32160 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
32170 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73   by one. This is
32180 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74 68   described as th
32190 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c  e "balance-shall
321a0 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62  ower".    ** sub
321b0 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f  -algorithm in so
321c0 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  me documentation
321d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
321e0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
321f0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
32200 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  se, the call to 
32210 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
32220 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61  ) .    ** sets a
32230 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ll pointer-map e
32240 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e  ntries correspon
32250 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
32260 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20   image pages .  
32270 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74    ** for which t
32280 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74  he pointer is st
32290 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
322a0 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f  content being co
322b0 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  pied..    **.   
322c0 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61   ** The second a
322d0 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69  ssert below veri
322e0 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68  fies that the ch
322f0 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66 72  ild page is defr
32300 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20  agmented.    ** 
32310 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20  (it must be, as 
32320 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f  it was just reco
32330 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67 20  nstructed using 
32340 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e  assemblePage()).
32350 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
32360 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65  important if the
32370 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61 70   parent page hap
32380 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20  pens to be page 
32390 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
323a0 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20  e.    ** image. 
323b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
323c0 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61  nNew==1 );.    a
323d0 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d  ssert( apNew[0]-
323e0 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20  >nFree == .     
323f0 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61 70     (get2byte(&ap
32400 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d  New[0]->aData[5]
32410 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c  )-apNew[0]->cell
32420 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d  Offset-apNew[0]-
32430 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29  >nCell*2) .    )
32440 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
32450 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
32460 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20  pParent, &rc);. 
32470 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e 65     freePage(apNe
32480 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65  w[0], &rc);.  }e
32490 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56 41  lse if( ISAUTOVA
324a0 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46  CUUM ){.    /* F
324b0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ix the pointer-m
324c0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
324d0 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61  ll the cells tha
324e0 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61  t were shifted a
324f0 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54  round. .    ** T
32500 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
32510 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
32520 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   of pointer-map 
32530 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65  entries that nee
32540 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64  d to.    ** be d
32550 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 69  ealt with by thi
32560 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20  s routine. Some 
32570 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62 65  of these have be
32580 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20  en set already, 
32590 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20  but.    ** many 
325a0 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f  have not. The fo
325b0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d  llowing is a sum
325c0 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mary:.    **.   
325d0 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74   **   1) The ent
325e0 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
325f0 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67  with new sibling
32600 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
32610 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20   not.    **     
32620 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74   siblings when t
32630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
32640 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68   called. These h
32650 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ave already.    
32660 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65 74  **      been set
32670 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20  . We don't need 
32680 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f  to worry about o
32690 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  ld siblings that
326a0 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   were.    **    
326b0 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66    moved to the f
326c0 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66  ree-list - the f
326d0 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68  reePage() code h
326e0 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20  as taken care.  
326f0 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f    **      of tho
32700 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
32710 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74  *   2) The point
32720 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er-map entries a
32730 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
32740 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
32750 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61  w.    **      pa
32760 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c  ge in any overfl
32770 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62  ow chains used b
32780 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  y new divider ce
32790 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20  lls. These .    
327a0 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73  **      have als
327b0 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  o already been t
327c0 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20  aken care of by 
327d0 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
327e0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
327f0 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65    **   3) If the
32800 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
32810 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
32820 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61  hen the child pa
32830 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20  ges of.    **   
32840 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20     cells stored 
32850 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  on the sibling p
32860 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ages may need to
32870 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
32880 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20   **.    **   4) 
32890 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
328a0 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74  ages are not int
328b0 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
328c0 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20  es, then any.   
328d0 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f   **      overflo
328e0 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20  w pages used by 
328f0 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20  these cells may 
32900 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
32910 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28  ed.    **      (
32920 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
32930 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74  nodes never cont
32940 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ain pointers to 
32950 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
32960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32970 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   5) If the sibli
32980 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
32990 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
329a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
329b0 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65    **      entrie
329c0 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  s for the right-
329d0 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65  child pages of e
329e0 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20  ach sibling may 
329f0 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  need.    **     
32a00 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
32a10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61      **.    ** Ca
32a20 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65 20  ses 1 and 2 are 
32a30 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65  dealt with above
32a40 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20   by other code. 
32a50 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
32a60 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
32a70 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20 61   cases 3 and 4 a
32a80 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72  nd the one after
32a90 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53   that, case 5. S
32aa0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74  ince.    ** sett
32ab0 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61  ing a pointer ma
32ac0 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c  p entry is a rel
32ad0 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76  atively expensiv
32ae0 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69  e operation, thi
32af0 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e  s.    ** code on
32b00 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20  ly sets pointer 
32b10 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
32b20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
32b30 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  w pages that hav
32b40 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  e.    ** actuall
32b50 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20  y moved between 
32b60 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d  pages.  */.    M
32b70 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
32b80 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d  pNew[0];.    Mem
32b90 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
32ba0 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[0];.    int 
32bb0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
32bc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
32bd0 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20   int iNextOld = 
32be0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f  pOld->nCell + nO
32bf0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74  verflow;.    int
32c00 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f   iOverflow = (nO
32c10 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e  verflow ? pOld->
32c20 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d  aOvfl[0].idx : -
32c30 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
32c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
32c60 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
32c70 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
32c80 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
32c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ca0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
32cb0 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
32cc0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
32cd0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
32ce0 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
32cf0 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
32d00 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
32d10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
32d20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
32d30 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
32d40 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
32d50 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
32d60 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
32d70 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
32d80 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
32d90 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
32da0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
32db0 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
32dc0 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
32dd0 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
32de0 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70         pOld = ap
32df0 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20  Copy[++j];.     
32e00 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20     iNextOld = i 
32e10 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
32e20 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64  ld->nCell + pOld
32e30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
32e40 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e       if( pOld->n
32e50 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32e60 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20        nOverflow 
32e70 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
32e80 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76  w;.          iOv
32e90 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65  erflow = i + !le
32ea0 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61  afData + pOld->a
32eb0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20  Ovfl[0].idx;.   
32ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
32ed0 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66  sDivider = !leaf
32ee0 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a  Data;  .      }.
32ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
32f00 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76  verflow>0 || iOv
32f10 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20  erflow<i );.    
32f20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
32f30 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f  ow<2 || pOld->aO
32f40 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64  vfl[0].idx==pOld
32f50 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31  ->aOvfl[1].idx-1
32f60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32f70 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70  nOverflow<3 || p
32f80 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
32f90 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32  x==pOld->aOvfl[2
32fa0 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
32fb0 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77  if( i==iOverflow
32fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69   ){.        isDi
32fd0 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  vider = 1;.     
32fe0 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66     if( (--nOverf
32ff0 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  low)>0 ){.      
33000 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b      iOverflow++;
33010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33020 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d   }..      if( i=
33030 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20  =cntNew[k] ){.  
33040 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20        /* Cell i 
33050 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65  is the cell imme
33060 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
33070 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  g the last cell 
33080 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  on new.        *
33090 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b  * sibling page k
330a0 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  . If the sibling
330b0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70  s are not leaf p
330c0 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20  ages of an.     
330d0 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74     ** intkey b-t
330e0 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69  ree, then cell i
330f0 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65   is a divider ce
33100 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
33110 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b  pNew = apNew[++k
33120 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
33130 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69  leafData ) conti
33140 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
33150 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c     assert( j<nOl
33160 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
33170 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20  t( k<nNew );..  
33180 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65      /* If the ce
33190 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  ll was originall
331a0 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28  y divider cell (
331b0 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20  and is not now) 
331c0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f  or.      ** an o
331d0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72  verflow cell, or
331e0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   if the cell was
331f0 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69   located on a di
33200 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a  fferent sibling.
33210 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65        ** page be
33220 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69  fore the balanci
33230 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  ng, then the poi
33240 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
33250 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20   associated.    
33260 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68    ** with any ch
33270 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
33280 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
33290 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20   updated.  */.  
332a0 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65      if( isDivide
332b0 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21  r || pOld->pgno!
332c0 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
332d0 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
332e0 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
332f0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
33300 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
33310 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d  apCell[i]), PTRM
33320 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
33330 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
33340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
33350 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77  ( szCell[i]>pNew
33360 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
33370 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
33380 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61  tOvflPtr(pNew, a
33390 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a  pCell[i], &rc);.
333a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
333b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
333c0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
333d0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
333e0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
333f0 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79  .        u32 key
33400 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e   = get4byte(&apN
33410 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29  ew[i]->aData[8])
33420 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
33430 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54  Put(pBt, key, PT
33440 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65  RMAP_BTREE, apNe
33450 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  w[i]->pgno, &rc)
33460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33470 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68  .#if 0.    /* Th
33480 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  e ptrmapCheckPag
33490 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73  es() contains as
334a0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
334b0 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68  s that verify th
334c0 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f  at.    ** all po
334d0 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20  inter map pages 
334e0 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c  are set correctl
334f0 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66  y. This is helpf
33500 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a  ul while .    **
33510 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73   debugging. This
33520 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61   is usually disa
33530 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63  bled because a c
33540 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
33550 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65  may.    ** cause
33560 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
33570 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20  tement to fail. 
33580 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68   */.    ptrmapCh
33590 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20  eckPages(apNew, 
335a0 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61  nNew);.    ptrma
335b0 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61  pCheckPages(&pPa
335c0 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66  rent, 1);.#endif
335d0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
335e0 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
335f0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
33600 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20  ANCE: finished: 
33610 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
33620 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
33630 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c       nOld, nNew,
33640 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a   nCell));..  /*.
33650 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
33660 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
33670 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
33680 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63  nup:.  sqlite3Sc
33690 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
336a0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
336b0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
336c0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
336d0 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
336e0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
336f0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
33700 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
33710 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
33720 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
33730 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
33740 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ed when the root
33750 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
33760 65 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a  e structure is.*
33770 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20  * overfull (has 
33780 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
33790 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a  flow pages)..**.
337a0 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70  ** A new child p
337b0 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  age is allocated
337c0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
337d0 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
337e0 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69   root.** page, i
337f0 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f  ncluding overflo
33800 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70  w cells, are cop
33810 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69  ied into the chi
33820 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20  ld. The root.** 
33830 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65  page is then ove
33840 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65  rwritten to make
33850 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67   it an empty pag
33860 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74  e with the right
33870 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74  -child .** point
33880 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  er pointing to t
33890 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a  he new page..**.
338a0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
338b0 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72  ing, all pointer
338c0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
338d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
338e0 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ges .** that the
338f0 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20   new child-page 
33900 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  now contains poi
33910 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64  nters to are upd
33920 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74  ated. The.** ent
33930 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ry corresponding
33940 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68   to the new righ
33950 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
33960 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  of the root.** p
33970 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61  age is also upda
33980 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ted..**.** If su
33990 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69  ccessful, *ppChi
339a0 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e  ld is set to con
339b0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
339c0 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a   to the child .*
339d0 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54  * page and SQLIT
339e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
339f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
33a00 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71  he caller is req
33a10 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c  uired.** to call
33a20 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f   releasePage() o
33a30 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74  n *ppChild exact
33a40 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65  ly once. If an e
33a50 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
33a60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
33a70 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
33a80 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
33a90 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
33aa0 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
33ab0 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c  (MemPage *pRoot,
33ac0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69   MemPage **ppChi
33ad0 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ld){.  int rc;  
33ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33af0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33b00 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
33b10 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
33b20 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20  mPage *pChild = 
33b30 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
33b40 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  Pointer to a new
33b50 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
33b60 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
33b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b80 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
33b90 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
33ba0 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
33bb0 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d  ed *pBt = pRoot-
33bc0 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  >pBt;    /* The 
33bd0 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65  BTree */..  asse
33be0 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  rt( pRoot->nOver
33bf0 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65  flow>0 );.  asse
33c00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
33c10 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
33c20 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  x) );..  /* Make
33c30 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74   pRoot, the root
33c40 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
33c50 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41  ree, writable. A
33c60 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20  llocate a new . 
33c70 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69   ** page that wi
33c80 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
33c90 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  w right-child of
33ca0 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65   pPage. Copy the
33cb0 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f   contents.  ** o
33cc0 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65  f the node store
33cd0 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20  d on pRoot into 
33ce0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
33cf0 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
33d00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33d10 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
33d20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
33d30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
33d40 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
33d50 50 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64  Page(pBt,&pChild
33d60 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f  ,&pgnoChild,pRoo
33d70 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20  t->pgno,0);.    
33d80 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
33d90 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26  pRoot, pChild, &
33da0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41  rc);.    if( ISA
33db0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
33dc0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
33dd0 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52  , pgnoChild, PTR
33de0 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74  MAP_BTREE, pRoot
33df0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
33e00 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
33e10 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64   ){.    *ppChild
33e20 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
33e30 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
33e40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33e50 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
33e60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33e70 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
33e80 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
33e90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33ea0 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
33eb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
33ec0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
33ed0 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65  Cell==pRoot->nCe
33ee0 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  ll );..  TRACE((
33ef0 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
33f00 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
33f10 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  ", pRoot->pgno, 
33f20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
33f30 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f  .  /* Copy the o
33f40 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72  verflow cells fr
33f50 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69  om pRoot to pChi
33f60 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  ld */.  memcpy(p
33f70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52  Child->aOvfl, pR
33f80 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  oot->aOvfl, pRoo
33f90 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  t->nOverflow*siz
33fa0 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  eof(pRoot->aOvfl
33fb0 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
33fc0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f  >nOverflow = pRo
33fd0 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a  ot->nOverflow;..
33fe0 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f    /* Zero the co
33ff0 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e  ntents of pRoot.
34000 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43   Then install pC
34010 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68  hild as the righ
34020 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65  t-child. */.  ze
34030 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43  roPage(pRoot, pC
34040 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
34050 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
34060 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  ut4byte(&pRoot->
34070 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
34080 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
34090 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69  hild);..  *ppChi
340a0 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72  ld = pChild;.  r
340b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
340c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
340d0 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
340e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
340f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
34100 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
34110 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
34120 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
34130 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
34140 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
34150 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
34160 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
34170 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
34180 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
34190 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
341a0 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20  tine. Balancing 
341b0 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a  routines are:.**
341c0 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75  .**   balance_qu
341d0 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  ick().**   balan
341e0 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20  ce_deeper().**  
341f0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34200 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ().*/.static int
34210 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f   balance(BtCurso
34220 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
34230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34240 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e    const int nMin
34250 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73   = pCur->pBt->us
34260 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33  ableSize * 2 / 3
34270 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51  ;.  u8 aBalanceQ
34280 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20  uickSpace[13];. 
34290 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
342a0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
342b0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63   balance_quick_c
342c0 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54  alled = 0 );.  T
342d0 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
342e0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
342f0 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20  ed = 0 );..  do 
34300 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
34310 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
34320 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
34330 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
34340 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66  [iPage];..    if
34350 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( iPage==0 ){.  
34360 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
34370 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
34380 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
34390 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
343a0 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ee is overfull. 
343b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c  In this case cal
343c0 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  l the.        **
343d0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
343e0 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72  ) function to cr
343f0 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
34400 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
34410 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  ge.        ** an
34420 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72 65  d copy the curre
34430 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
34440 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  he root-page to 
34450 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  it. The.        
34460 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  ** next iteratio
34470 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
34480 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
34490 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  e child page..  
344a0 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
344b0 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
344c0 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
344d0 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
344e0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
344f0 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70 43  eeper(pPage, &pC
34500 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a  ur->apPage[1]);.
34510 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
34520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34530 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61         pCur->iPa
34540 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ge = 1;.        
34550 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
34560 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
34570 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d  pCur->aiIdx[1] =
34580 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
34590 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
345a0 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[1]->nOverflow
345b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
345c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
345d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
345e0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
345f0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34600 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
34610 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20  ree<=nMin ){.   
34620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
34630 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  lse{.      MemPa
34640 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65  ge * const pPare
34650 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  nt = pCur->apPag
34660 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20  e[iPage-1];.    
34670 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78    int const iIdx
34680 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
34690 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20  Page-1];..      
346a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
346b0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
346c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
346d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
346e0 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
346f0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
34700 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
34710 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
34720 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
34730 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
34740 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
34750 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
34760 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
34770 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
34780 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
34790 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
347a0 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
347b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
347c0 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
347d0 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
347e0 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
347f0 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
34800 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
34810 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
34820 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
34830 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
34840 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
34850 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
34860 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
34870 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
34880 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
34890 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
348a0 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
348b0 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
348c0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
348d0 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
348e0 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
348f0 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
34900 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
34910 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
34920 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
34930 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
34940 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
34950 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
34960 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
34970 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
34980 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
34990 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
349a0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
349b0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
349c0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
349d0 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
349e0 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
349f0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
34a00 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
34a10 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
34a20 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
34a30 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
34a40 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
34a50 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
34a60 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
34a70 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
34a80 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
34a90 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
34aa0 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
34ab0 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
34ac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34ad0 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
34ae0 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
34af0 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
34b00 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
34b10 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
34b20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
34b30 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
34b40 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
34b50 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
34b60 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
34b70 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
34b80 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
34b90 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
34ba0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
34bb0 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
34bc0 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
34bd0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
34be0 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
34bf0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
34c00 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
34c10 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
34c20 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
34c30 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
34c40 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
34c50 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
34c60 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
34c70 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
34c80 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
34c90 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
34ca0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
34cb0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
34cc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
34cd0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
34ce0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
34cf0 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
34d00 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
34d10 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
34d20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
34d30 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
34d40 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
34d50 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
34d60 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
34d70 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
34d80 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34d90 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
34da0 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
34db0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
34dc0 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
34dd0 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
34de0 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
34df0 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
34e00 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
34e10 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
34e20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
34e30 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
34e40 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
34e50 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
34e60 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
34e70 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
34e80 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
34e90 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
34ea0 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
34eb0 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
34ec0 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
34ed0 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
34ee0 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
34ef0 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
34f00 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
34f10 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
34f20 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
34f30 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
34f40 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
34f50 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
34f60 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
34f70 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
34f80 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
34f90 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
34fa0 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
34fb0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
34fc0 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
34fd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
34fe0 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
34ff0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
35000 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
35010 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
35020 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
35030 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
35040 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31  pSpace, iPage==1
35050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
35060 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
35070 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65        /* If pFre
35080 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
35090 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
350a0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
350b0 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed .            
350c0 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73  ** by a previous
350d0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
350e0 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20  _nonroot(). Its 
350f0 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20  contents are.   
35100 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20           ** now 
35110 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e  stored either on
35120 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70   real database p
35130 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74  ages or within t
35140 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
35150 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75  ** new pSpace bu
35160 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20  ffer, so it may 
35170 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20  be safely freed 
35180 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
35190 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
351a0 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
351b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
351c0 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63      /* The pSpac
351d0 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  e buffer will be
351e0 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65   freed after the
351f0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20   next call to.  
35200 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
35210 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72  ce_nonroot(), or
35220 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69   just before thi
35230 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
35240 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20  ns, whichever.  
35250 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73          ** comes
35260 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20   first. */.     
35270 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70       pFree = pSp
35280 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ace;.        }. 
35290 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
352a0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
352b0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
352c0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
352d0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
352e0 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
352f0 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
35300 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35310 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
35320 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
35330 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
35340 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
35350 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
35360 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
35370 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
35380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
35390 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
353a0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
353b0 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
353c0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
353d0 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
353e0 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
353f0 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
35400 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
35410 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
35420 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
35430 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
35440 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
35450 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
35460 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
35470 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
35480 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
35490 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
354a0 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
354b0 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
354c0 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
354d0 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
354e0 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
354f0 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
35500 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
35510 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
35520 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
35530 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
35540 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
35550 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73  o, then a succes
35560 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  sful call to.** 
35570 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
35580 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
35590 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
355a0 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
355b0 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
355c0 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
355d0 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
355e0 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20  ult returned (a 
355f0 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62  negative.** numb
35600 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  er if pCur point
35610 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  s at an entry th
35620 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
35630 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c  an (pKey, nKey),
35640 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76   or.** a positiv
35650 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20  e value if pCur 
35660 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72  points at an etr
35670 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  y that is larger
35680 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c   than .** (pKey,
35690 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20   nKey)). .**.** 
356a0 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
356b0 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  t parameter is 0
356c0 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43  , then cursor pC
356d0 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ur may point to 
356e0 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72  any .** entry or
356f0 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20   to no entry at 
35700 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  all. In this cas
35710 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
35720 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
35730 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
35740 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
35750 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
35760 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35770 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
35780 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
35790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
357a0 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
357b0 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
357c0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
357d0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
357e0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
357f0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
35800 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
35810 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
35820 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
35830 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
35840 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
35850 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
35860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35870 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
35880 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
35890 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
358a0 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
358c0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
358d0 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
358e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
358f0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
35900 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
35910 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f   of prior Moveto
35920 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20  Unpacked() call 
35930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
35940 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
35950 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73 7a  Result;.  int sz
35960 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
35970 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35980 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
35990 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
359a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
359b0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
359c0 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
359d0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
359e0 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
359f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
35a00 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
35a10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
35a20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
35a30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
35a40 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
35a50 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61  ipNext;.  }..  a
35a60 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35a70 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35a80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
35a90 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  >wrFlag && pBt->
35aa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
35ab0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70  RANS_WRITE && !p
35ac0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
35ad0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
35ae0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
35af0 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
35b00 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
35b10 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20  nfo!=0, 2) );.. 
35b20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
35b30 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62  the caller has b
35b40 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20  een consistent. 
35b50 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  If this cursor w
35b60 61 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65  as opened.  ** e
35b70 78 70 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65  xpecting an inde
35b80 78 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74  x b-tree, then t
35b90 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
35ba0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c   be inserting bl
35bb0 6f 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74  ob.  ** keys wit
35bc0 68 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20  h no associated 
35bd0 64 61 74 61 2e 20 49 66 20 74 68 65 20 63 75 72  data. If the cur
35be0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65  sor was opened e
35bf0 78 70 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a  xpecting an.  **
35c00 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
35c10 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
35c20 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   be inserting in
35c30 74 65 67 65 72 20 6b 65 79 73 20 77 69 74 68 20  teger keys with 
35c40 61 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  a.  ** blob of a
35c50 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
35c60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
35c70 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
35c80 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
35c90 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
35ca0 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   an insert into 
35cb0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
35cc0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
35cd0 6e 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75  ncrblob .  ** cu
35ce0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
35cf0 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c  e row being repl
35d00 61 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74  aced (assuming t
35d10 68 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65  his is a replace
35d20 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
35d30 2d 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  - if it is not, 
35d40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
35d50 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20   a no-op).  */. 
35d60 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49   if( pCur->pKeyI
35d70 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nfo==0 ){.    in
35d80 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
35d90 43 75 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79 2c  Cursors(p, nKey,
35da0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   0);.  }..  /* S
35db0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
35dc0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
35dd0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
35de0 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  his table..  **.
35df0 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73    ** In some cas
35e00 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  es, the call to 
35e10 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65  btreeMoveto() be
35e20 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  low is a no-op. 
35e30 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65  For.  ** example
35e40 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  , when inserting
35e50 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
35e60 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e  le with auto-gen
35e70 65 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20  erated integer. 
35e80 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44   ** keys, the VD
35e90 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73  BE layer invokes
35ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
35eb0 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
35ec0 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65  t the .  ** inte
35ed0 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20  ger key to use. 
35ee0 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
35ef0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61  is function to a
35f00 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74  ctually insert t
35f10 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e  he .  ** data in
35f20 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d  to the intkey B-
35f30 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
35f40 73 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29  se btreeMoveto()
35f50 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a   recognizes.  **
35f60 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
35f70 20 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72   is already wher
35f80 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  e it needs to be
35f90 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74   and returns wit
35fa0 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  hout.  ** doing 
35fb0 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f  any work. To avo
35fc0 69 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65  id thwarting the
35fd0 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  se optimizations
35fe0 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
35ff0 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c  t.  ** not to cl
36000 65 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68  ear the cursor h
36010 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ere..  */.  rc =
36020 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
36030 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
36040 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
36050 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36060 3b 0a 20 20 69 66 28 20 21 6c 6f 63 20 29 7b 0a  ;.  if( !loc ){.
36070 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f      rc = btreeMo
36080 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
36090 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
360a0 73 2c 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69 66  s, &loc);.    if
360b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
360c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
360d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
360e0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
360f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
36100 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c  SOR_INVALID && l
36110 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20  oc) );..  pPage 
36120 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
36130 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
36140 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
36150 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
36160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36170 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
36180 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ge->intKey );.. 
36190 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
361a0 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
361b0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
361c0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
361d0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
361e0 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
361f0 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
36200 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
36210 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
36220 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
36230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
36240 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
36250 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
36260 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
36270 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
36280 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
36290 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
362a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
362b0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
362c0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
362d0 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
362e0 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
362f0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
36300 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
36310 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
36320 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
36330 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
36340 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
36350 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
36360 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
36370 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
36380 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
36390 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36  oc==0 ){.    u16
363a0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
363b0 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
363c0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
363d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
363e0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
363f0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
36400 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
36410 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
36420 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
36430 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
36440 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
36450 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
36460 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
36470 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
36480 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
36490 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
364a0 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
364b0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
364c0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
364d0 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
364e0 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 2c  age, idx, szOld,
364f0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
36500 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
36510 65 72 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ert;.  }else if(
36520 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
36530 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
36540 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
36550 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  eaf );.    idx =
36560 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
36570 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
36580 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36590 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
365a0 0a 20 20 7d 0a 20 20 69 6e 73 65 72 74 43 65 6c  .  }.  insertCel
365b0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65  l(pPage, idx, ne
365c0 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
365d0 20 30 2c 20 26 72 63 29 3b 0a 20 20 61 73 73 65   0, &rc);.  asse
365e0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
365f0 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K || pPage->nCel
36600 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  l>0 || pPage->nO
36610 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
36620 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
36630 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70  as occured and p
36640 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72  Page has an over
36650 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20  flow cell, call 
36660 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20  balance() .  ** 
36670 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
36680 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  the cells within
36690 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65   the tree. Since
366a0 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d   balance() may m
366b0 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
366c0 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74  sor, zero the Bt
366d0 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a  Cursor.info.nSiz
366e0 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76  e and BtCursor.v
366f0 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61  alidNKey.  ** va
36700 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20  riables..  **.  
36710 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
36720 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
36730 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74  alled moveToRoot
36740 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63  () to move the c
36750 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20  ursor.  ** back 
36760 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
36770 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73   as balance() us
36780 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ed to invalidate
36790 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
367a0 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61  ** of BtCursor.a
367b0 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75  pPage[] and BtCu
367c0 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e  rsor.aiIdx[]. In
367d0 73 74 65 61 64 20 6f 66 20 64 6f 69 6e 67 20 74  stead of doing t
367e0 68 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  hat,.  ** set th
367f0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
36800 6f 20 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69  o "invalid". Thi
36810 73 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69  s makes common i
36820 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
36830 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66  .  ** slightly f
36840 61 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  aster..  **.  **
36850 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62 74   There is a subt
36860 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74  le but important
36870 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65   optimization he
36880 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73  re too. When ins
36890 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74  erting.  ** mult
368a0 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74  iple records int
368b0 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72  o an intkey b-tr
368c0 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ee using a singl
368d0 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e  e cursor (as can
368e0 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69  .  ** happen whi
368f0 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  le processing an
36900 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e   "INSERT INTO ..
36910 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d  . SELECT" statem
36920 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73  ent), it.  ** is
36930 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f   advantageous to
36940 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f   leave the curso
36950 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
36960 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a  e last entry in.
36970 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
36980 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20  if possible. If 
36990 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
369a0 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
369b0 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74  he last.  ** ent
369c0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ry in the table,
369d0 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f   and the next ro
369e0 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20 61  w inserted has a
369f0 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20  n integer key.  
36a00 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ** larger than t
36a10 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
36a20 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70  ing key, it is p
36a30 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72  ossible to inser
36a40 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77  t the.  ** row w
36a50 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74  ithout seeking t
36a60 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20  he cursor. This 
36a70 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65 72  can be a big per
36a80 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
36a90 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66    */.  pCur->inf
36aa0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
36ab0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
36ac0 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
36ad0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
36ae0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
36af0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
36b00 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  pCur);..    /* M
36b10 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
36b20 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
36b30 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
36b40 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
36b50 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74     ** fails. Int
36b60 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
36b70 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ture corruption 
36b80 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65  will result othe
36b90 72 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20 41  rwise. .    ** A
36ba0 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75 72  lso, set the cur
36bb0 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e 76  sor state to inv
36bc0 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70 73  alid. This stops
36bd0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
36be0 69 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72 6f  ion().    ** fro
36bf0 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  m trying to save
36c00 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
36c10 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72  ition of the cur
36c20 73 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43 75  sor.  */.    pCu
36c30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
36c40 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
36c50 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  w = 0;.    pCur-
36c60 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
36c70 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
36c80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
36c90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
36ca0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  ]->nOverflow==0 
36cb0 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a  );..end_insert:.
36cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36cd0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
36ce0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
36cf0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
36d00 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
36d10 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
36d20 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69  inting at a arbi
36d30 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  trary location..
36d40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
36d50 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
36d60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
36d70 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
36d80 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
36d90 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
36da0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
36db0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36dd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
36de0 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ode */.  MemPage
36df0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
36e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36e10 20 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20   Page to delete 
36e20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  cell from */.  u
36e30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
36e40 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36e50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
36e60 6f 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  o cell to delete
36e70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49   */.  int iCellI
36e80 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
36e90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
36ea0 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64  dex of cell to d
36eb0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
36ec0 43 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20  CellDepth;      
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ee0 2f 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65  /* Depth of node
36ef0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c   containing pCel
36f00 6c 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28  l */ ..  assert(
36f10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
36f20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
36f30 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
36f40 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
36f50 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
36f60 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
36f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
36f80 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
36f90 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
36fa0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
36fb0 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
36fc0 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
36fd0 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61 73  o!=0, 2) );.  as
36fe0 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
36ff0 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d  nflicts(p, pCur-
37000 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20  >pgnoRoot) );.. 
37010 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
37020 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37030 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
37040 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
37050 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45  nCell) .   || NE
37060 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
37070 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  !=CURSOR_VALID).
37080 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
37090 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
370a0 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
370b0 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20  gone awry. */.  
370c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
370d0 69 73 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72  is a delete oper
370e0 61 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65 20  ation to remove 
370f0 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 74 61 62  a row from a tab
37100 6c 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a 20  le b-tree,.  ** 
37110 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
37120 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
37130 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
37140 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 20  being deleted.  
37150 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
37160 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
37170 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
37180 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70  blobCursors(p, p
37190 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20  Cur->info.nKey, 
371a0 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c  0);.  }..  iCell
371b0 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50  Depth = pCur->iP
371c0 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20  age;.  iCellIdx 
371d0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43  = pCur->aiIdx[iC
371e0 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61  ellDepth];.  pPa
371f0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
37200 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  e[iCellDepth];. 
37210 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
37220 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
37230 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  x);..  /* If the
37240 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
37250 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65   the entry to de
37260 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
37270 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20  af page, move.  
37280 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ** the cursor to
37290 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
372a0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  ry in the tree t
372b0 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  hat is smaller t
372c0 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74  han.  ** the ent
372d0 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ry being deleted
372e0 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c  . This cell will
372f0 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c   replace the cel
37300 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a  l being deleted.
37310 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
37320 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65  ternal node. The
37330 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72   'previous' entr
37340 79 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68  y is used for th
37350 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20  is instead.  ** 
37360 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e  of the 'next' en
37370 74 72 79 2c 20 61 73 20 74 68 65 20 70 72 65 76  try, as the prev
37380 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c  ious entry is al
37390 77 61 79 73 20 61 20 70 61 72 74 20 6f 66 20 74  ways a part of t
373a0 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65  he.  ** sub-tree
373b0 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63   headed by the c
373c0 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65  hild page of the
373d0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
373e0 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a  ted. This makes.
373f0 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74    ** balancing t
37400 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e  he tree followin
37410 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65  g the delete ope
37420 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20  ration easier.  
37430 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
37440 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
37450 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 72 63   notUsed;.    rc
37460 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
37470 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e  revious(pCur, &n
37480 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
37490 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
374a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
374b0 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
374c0 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
374d0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
374e0 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  table before.  *
374f0 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64  * making any mod
37500 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65  ifications. Make
37510 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
37520 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
37530 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74  o be .  ** delet
37540 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65  ed writable. The
37550 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66  n free any overf
37560 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
37570 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20  ated with the . 
37580 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69   ** entry and fi
37590 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65  nally remove the
375a0 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f   cell itself fro
375b0 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  m within the pag
375c0 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  e.  .  */.  rc =
375d0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
375e0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
375f0 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
37600 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37610 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
37620 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
37630 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
37640 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37650 3b 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  ;.  rc = clearCe
37660 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
37670 3b 0a 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  ;.  dropCell(pPa
37680 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65  ge, iCellIdx, ce
37690 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
376a0 20 70 43 65 6c 6c 29 2c 20 26 72 63 29 3b 0a 20   pCell), &rc);. 
376b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
376c0 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   rc;..  /* If th
376d0 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77  e cell deleted w
376e0 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f  as not located o
376f0 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  n a leaf page, t
37700 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20  hen the cursor. 
37710 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79   ** is currently
37720 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
37730 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69   largest entry i
37740 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68  n the sub-tree h
37750 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eaded.  ** by th
37760 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20  e child-page of 
37770 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61  the cell that wa
37780 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66  s just deleted f
37790 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a  rom an internal.
377a0 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63    ** node. The c
377b0 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61  ell from the lea
377c0 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20  f node needs to 
377d0 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
377e0 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f  internal.  ** no
377f0 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  de to replace th
37800 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20  e deleted cell. 
37810 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
37820 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65  ->leaf ){.    Me
37830 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70  mPage *pLeaf = p
37840 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
37850 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
37860 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e  t nCell;.    Pgn
37870 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  o n = pCur->apPa
37880 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d  ge[iCellDepth+1]
37890 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69  ->pgno;.    unsi
378a0 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b  gned char *pTmp;
378b0 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ..    pCell = fi
378c0 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c  ndCell(pLeaf, pL
378d0 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  eaf->nCell-1);. 
378e0 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53     nCell = cellS
378f0 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43  izePtr(pLeaf, pC
37900 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ell);.    assert
37910 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
37920 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20  Bt)>=nCell );.. 
37930 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
37940 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70  pace(pBt);.    p
37950 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  Tmp = pBt->pTmpS
37960 70 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20  pace;..    rc = 
37970 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37980 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65  e(pLeaf->pDbPage
37990 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  );.    insertCel
379a0 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
379b0 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c  x, pCell-4, nCel
379c0 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 2c 20 26 72  l+4, pTmp, n, &r
379d0 63 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  c);.    dropCell
379e0 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
379f0 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 2c 20 26  Cell-1, nCell, &
37a00 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
37a10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37a20 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74  ..  /* Balance t
37a30 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65 20  he tree. If the 
37a40 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61  entry deleted wa
37a50 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c  s located on a l
37a60 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74  eaf page,.  ** t
37a70 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73  hen the cursor s
37a80 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  till points to t
37a90 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69  hat page. In thi
37aa0 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74  s case the first
37ab0 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61  .  ** call to ba
37ac0 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73 20  lance() repairs 
37ad0 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68  the tree, and th
37ae0 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74  e if(...) condit
37af0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65  ion is.  ** neve
37b00 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a  r true..  **.  *
37b10 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
37b20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
37b30 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65  d was on an inte
37b40 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20  rnal node page, 
37b50 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69  then.  ** pCur i
37b60 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
37b70 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  e leaf page from
37b80 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61   which a cell wa
37b90 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  s removed to.  *
37ba0 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65  * replace the ce
37bb0 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  ll deleted from 
37bc0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
37bd0 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68  e. This is sligh
37be0 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20  tly.  ** tricky 
37bf0 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  as the leaf node
37c00 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c   may be underful
37c10 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72  l, and the inter
37c20 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a  nal node may.  *
37c30 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 65  * be either unde
37c40 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49  r or overfull. I
37c50 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e 20  n this case run 
37c60 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c  the balancing al
37c70 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20  gorithm.  ** on 
37c80 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69  the leaf node fi
37c90 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61  rst. If the bala
37ca0 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61 72  nce proceeds far
37cb0 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20   enough up the. 
37cc0 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77 65   ** tree that we
37cd0 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
37ce0 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e  t any problem in
37cf0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
37d00 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  de has.  ** been
37d10 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62   corrected, so b
37d20 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  e it. Otherwise,
37d30 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
37d40 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a   the leaf node,.
37d50 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75    ** walk the cu
37d60 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65 65  rsor up the tree
37d70 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
37d80 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63   node and balanc
37d90 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65  e it as .  ** we
37da0 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62  ll.  */.  rc = b
37db0 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20  alance(pCur);.  
37dc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37dd0 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  K && pCur->iPage
37de0 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20  >iCellDepth ){. 
37df0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
37e00 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
37e10 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
37e20 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
37e30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
37e40 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ]);.    }.    rc
37e50 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
37e60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
37e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37e80 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
37e90 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
37ea0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
37eb0 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
37ec0 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
37ed0 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
37ee0 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
37ef0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
37f00 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
37f10 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
37f20 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
37f30 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
37f40 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
37f50 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
37f60 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
37f70 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
37f80 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
37f90 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
37fa0 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
37fb0 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
37fc0 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
37fd0 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
37fe0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
37ff0 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
38000 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
38010 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
38020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
38030 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
38040 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
38050 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
38060 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
38070 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
38080 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
38090 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
380a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
380b0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
380c0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
380d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
380e0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
380f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
38100 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
38110 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
38120 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
38130 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
38140 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
38150 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
38160 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
38170 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
38180 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
38190 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
381a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
381b0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
381c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
381d0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
381e0 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
381f0 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
38200 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
38210 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
38220 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
38230 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
38240 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
38250 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
38260 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
38270 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
38280 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
38290 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
382a0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
382b0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
382c0 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
382d0 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
382e0 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
382f0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
38300 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
38310 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
38320 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
38330 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
38340 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
38350 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
38360 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
38370 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
38380 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
38390 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
383a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
383b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
383c0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
383d0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
383e0 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
383f0 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
38400 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
38410 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
38420 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
38430 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
38440 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
38450 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
38460 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
38470 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54  p, BTREE_LARGEST
38480 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e  _ROOT_PAGE, &pgn
38490 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e 6f  oRoot);.    pgno
384a0 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
384b0 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
384c0 65 2