/ Hex Artifact Content
Login

Artifact 97d32ef9e00bd9d321fe1c53a3b6651928d8ea06:


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 35 20 32 30 30 39 2f 30  c,v 1.705 2009/0
0190: 38 2f 31 30 20 30 33 3a 35 37 3a 35 38 20 73 68  8/10 03:57:58 sh
01a0: 61 6e 65 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20  ane Exp $.**.** 
01b0: 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d  This file implem
01c0: 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20  ents a external 
01d0: 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74  (disk-based) dat
01e0: 61 62 61 73 65 20 75 73 69 6e 67 20 42 54 72 65  abase using BTre
01f0: 65 73 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68  es..** See the h
0200: 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e  eader comment on
0210: 20 22 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f   "btreeInt.h" fo
0220: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
0230: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63  ormation..** Inc
0240: 6c 75 64 69 6e 67 20 61 20 64 65 73 63 72 69 70  luding a descrip
0250: 74 69 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72  tion of file for
0260: 6d 61 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76  mat and an overv
0270: 69 65 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  iew of operation
0280: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62  ..*/.#include "b
0290: 74 72 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  treeInt.h"../*.*
02a0: 2a 20 54 68 65 20 68 65 61 64 65 72 20 73 74 72  * The header str
02b0: 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
02c0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
02d0: 67 20 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51  g of every.** SQ
02e0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a  Lite database..*
02f0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
0300: 68 61 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72  har zMagicHeader
0310: 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45  [] = SQLITE_FILE
0320: 5f 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20  _HEADER;../*.** 
0330: 53 65 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20  Set this global 
0340: 76 61 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f  variable to 1 to
0350: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
0360: 75 73 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a  using the TRACE.
0370: 2a 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  ** macro..*/.#if
0380: 20 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74   0.int sqlite3Bt
0390: 72 65 65 54 72 61 63 65 3d 31 3b 20 20 2f 2a 20  reeTrace=1;  /* 
03a0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74  True to enable t
03b0: 72 61 63 69 6e 67 20 2a 2f 0a 23 20 64 65 66 69  racing */.# defi
03c0: 6e 65 20 54 52 41 43 45 28 58 29 20 20 69 66 28  ne TRACE(X)  if(
03d0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 61 63  sqlite3BtreeTrac
03e0: 65 29 7b 70 72 69 6e 74 66 20 58 3b 66 66 6c 75  e){printf X;fflu
03f0: 73 68 28 73 74 64 6f 75 74 29 3b 7d 0a 23 65 6c  sh(stdout);}.#el
0400: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41 43  se.# define TRAC
0410: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23  E(X).#endif....#
0420: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0430: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0440: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 20 6f 66 20  /*.** A list of 
0450: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73  BtShared objects
0460: 20 74 68 61 74 20 61 72 65 20 65 6c 69 67 69 62   that are eligib
0470: 6c 65 20 66 6f 72 20 70 61 72 74 69 63 69 70 61  le for participa
0480: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65  tion.** in share
0490: 64 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 76  d cache.  This v
04a0: 61 72 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65  ariable has file
04b0: 20 73 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f   scope during no
04c0: 72 6d 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20  rmal builds,.** 
04d0: 62 75 74 20 74 68 65 20 74 65 73 74 20 68 61 72  but the test har
04e0: 6e 65 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63  ness needs to ac
04f0: 63 65 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61  cess it so we ma
0500: 6b 65 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72  ke it global for
0510: 20 0a 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73   .** test builds
0520: 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74  ..**.** Access t
0530: 6f 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  o this variable 
0540: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
0550: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
0560: 54 49 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23  TIC_MASTER..*/.#
0570: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0580: 54 0a 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49  T.BtShared *SQLI
0590: 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68  TE_WSD sqlite3Sh
05a0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20  aredCacheList = 
05b0: 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20  0;.#else.static 
05c0: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
05d0: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05e0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05f0: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f  .#endif.#endif /
0600: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
0610: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
0620: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0630: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0640: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
0650: 64 69 73 61 62 6c 65 20 74 68 65 20 73 68 61 72  disable the shar
0660: 65 64 20 70 61 67 65 72 20 61 6e 64 20 73 63 68  ed pager and sch
0670: 65 6d 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a  ema features..**
0680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0690: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f   has no effect o
06a0: 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
06b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
06c0: 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20 63  .** The shared c
06d0: 61 63 68 65 20 73 65 74 74 69 6e 67 20 65 66 66  ache setting eff
06e0: 65 63 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65  ects only future
06f0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
0700: 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c  ite3_open(), sql
0710: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f  ite3_open16(), o
0720: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
0730: 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  2()..*/.int sqli
0740: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
0750: 64 5f 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62  d_cache(int enab
0760: 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c  le){.  sqlite3Gl
0770: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
0780: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20  dCacheEnabled = 
0790: 65 6e 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e  enable;.  return
07a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
07b0: 6e 64 69 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53  ndif....#ifdef S
07c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
07d0: 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a  D_CACHE.  /*.  *
07e0: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  * The functions 
07f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
0800: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74  TableLock(), set
0810: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0820: 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64  Lock(),.  ** and
0830: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
0840: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29  acheTableLocks()
0850: 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65  .  ** manipulate
0860: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
0870: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c  BtShared.pLock l
0880: 69 6e 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20  inked list used 
0890: 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68  to store.  ** sh
08a0: 61 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65  ared-cache table
08b0: 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66   level locks. If
08c0: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 20   the library is 
08d0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
08e0: 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61  e.  ** shared-ca
08f0: 63 68 65 20 66 65 61 74 75 72 65 20 64 69 73 61  che feature disa
0900: 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
0910: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e   is only ever on
0920: 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65  e user.  ** of e
0930: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
0940: 75 63 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68  ucture and so th
0950: 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f  is locking is no
0960: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20  t necessary. .  
0970: 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65  ** So define the
0980: 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75   lock related fu
0990: 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70  nctions as no-op
09a0: 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  s..  */.  #defin
09b0: 65 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  e querySharedCac
09c0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
09d0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
09e0: 64 65 66 69 6e 65 20 73 65 74 53 68 61 72 65 64  define setShared
09f0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61  CacheTableLock(a
0a00: 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,b,c) SQLITE_OK.
0a10: 20 20 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41    #define clearA
0a20: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
0a30: 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65  leLocks(a).  #de
0a40: 66 69 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c  fine downgradeAl
0a50: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
0a60: 65 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66  eLocks(a).  #def
0a70: 69 6e 65 20 68 61 73 53 68 61 72 65 64 43 61 63  ine hasSharedCac
0a80: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0a90: 63 2c 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65  c,d) 1.  #define
0aa0: 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74   hasReadConflict
0ab0: 73 28 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66  s(a, b) 0.#endif
0ac0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0ad0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0ae0: 48 45 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  HE..#ifdef SQLIT
0af0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68  E_DEBUG./*.** Th
0b00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
0b10: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
0b20: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20   of an assert() 
0b30: 73 74 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68  statement. It ch
0b40: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ecks.** that con
0b50: 6e 65 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20  nection p holds 
0b60: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0b70: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0b80: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62  ite to the .** b
0b90: 2d 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20  -tree with root 
0ba0: 70 61 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73  page iRoot. If s
0bb0: 6f 2c 20 74 72 75 65 20 69 73 20 72 65 74 75 72  o, true is retur
0bc0: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
0bd0: 66 61 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65  false. .** For e
0be0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69  xample, when wri
0bf0: 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
0c00: 62 2d 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74  b-tree with root
0c10: 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20  -page iRoot via 
0c20: 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63  .** Btree connec
0c30: 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a  tion pBtree:.**.
0c40: 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68 61  **    assert( ha
0c50: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
0c60: 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52  eLock(pBtree, iR
0c70: 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f  oot, 0, WRITE_LO
0c80: 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65  CK) );.**.** Whe
0c90: 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20  n writing to an 
0ca0: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74 68 61  index b-tree tha
0cb0: 74 20 72 65 73 69 64 65 73 20 69 6e 20 61 20 73  t resides in a s
0cc0: 68 61 72 61 62 6c 65 20 64 61 74 61 62 61 73 65  harable database
0cd0: 2c 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  , the .** caller
0ce0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72   should have fir
0cf0: 73 74 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f  st obtained a lo
0d00: 63 6b 20 73 70 65 63 69 66 79 69 6e 67 20 74 68  ck specifying th
0d10: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a  e root page of.*
0d20: 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
0d30: 69 6e 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ing table b-tree
0d40: 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69  . This makes thi
0d50: 6e 67 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63  ngs a bit more c
0d60: 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61  omplicated,.** a
0d70: 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72  s this module tr
0d80: 65 61 74 73 20 65 61 63 68 20 62 2d 74 72 65 65  eats each b-tree
0d90: 20 61 73 20 61 20 73 65 70 61 72 61 74 65 20 73   as a separate s
0da0: 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74  tructure. To det
0db0: 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61  ermine.** the ta
0dc0: 62 6c 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65  ble b-tree corre
0dd0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
0de0: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 62 65 69  index b-tree bei
0df0: 6e 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73  ng written, this
0e00: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  .** function has
0e10: 20 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75   to search throu
0e20: 67 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  gh the database 
0e30: 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e  schema..**.** In
0e40: 73 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20  stead of a lock 
0e50: 6f 6e 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f  on the b-tree ro
0e60: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
0e70: 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  ot, the caller m
0e80: 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69  ay.** hold a wri
0e90: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  te-lock on the s
0ea0: 63 68 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f  chema table (roo
0eb0: 74 20 70 61 67 65 20 31 29 2e 20 54 68 69 73 20  t page 1). This 
0ec0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70  is also.** accep
0ed0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
0ee0: 20 69 6e 74 20 68 61 73 53 68 61 72 65 64 43 61   int hasSharedCa
0ef0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20  cheTableLock(.  
0f00: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
0f10: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
0f20: 20 74 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20   that must hold 
0f30: 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  lock */.  Pgno i
0f40: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
0f50: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
0f60: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f70: 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20   isIndex,       
0f80: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
0f90: 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74  Root is the root
0fa0: 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   of an index b-t
0fb0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f  ree */.  int eLo
0fc0: 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20 20  ckType          
0fd0: 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b  /* Required lock
0fe0: 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b   type (READ_LOCK
0ff0: 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   or WRITE_LOCK) 
1000: 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a  */.){.  Schema *
1010: 70 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d  pSchema = (Schem
1020: 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d  a *)pBtree->pBt-
1030: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f  >pSchema;.  Pgno
1040: 20 69 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c   iTab = 0;.  BtL
1050: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f  ock *pLock;..  /
1060: 2a 20 49 66 20 74 68 69 73 20 62 2d 74 72 65 65  * If this b-tree
1070: 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1080: 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69   shareable, or i
1090: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
10a0: 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64  reading.  ** and
10b0: 20 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e   has the read-un
10c0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
10d0: 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b  et, then no lock
10e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20   is required. . 
10f0: 20 2a 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73   ** In these cas
1100: 65 73 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  es return true i
1110: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20  mmediately.  If 
1120: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1130: 61 64 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77  ading .  ** or w
1140: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1150: 62 2d 74 72 65 65 2c 20 62 75 74 20 74 68 65 20  b-tree, but the 
1160: 73 63 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f  schema is not lo
1170: 61 64 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72  aded, then retur
1180: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f  n.  ** true also
1190: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
11a0: 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69  he lock is requi
11b0: 72 65 64 2c 20 62 75 74 20 69 74 20 69 73 20 74  red, but it is t
11c0: 6f 6f 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a  oo difficult.  *
11d0: 2a 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  * to check if th
11e0: 65 20 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c  e client actuall
11f0: 79 20 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73  y holds it. This
1200: 20 64 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20   doesn't happen 
1210: 76 65 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e  very.  ** often.
1220: 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72    */.  if( (pBtr
1230: 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29  ee->sharable==0)
1240: 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70  .   || (eLockTyp
1250: 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20  e==READ_LOCK && 
1260: 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61  (pBtree->db->fla
1270: 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
1280: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20  Uncommitted)).  
1290: 20 7c 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20   || (isIndex && 
12a0: 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53  (!pSchema || (pS
12b0: 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f  chema->flags&DB_
12c0: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30  SchemaLoaded)==0
12d0: 20 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74   )).  ){.    ret
12e0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
12f0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
1300: 72 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74  root-page that t
1310: 68 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62  he lock should b
1320: 65 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74  e held on. For t
1330: 61 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65  able.  ** b-tree
1340: 73 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20  s, this is just 
1350: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1360: 20 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e   the b-tree bein
1370: 67 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77  g read or.  ** w
1380: 72 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65  ritten. For inde
1390: 78 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73  x b-trees, it is
13a0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
13b0: 66 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  f the associated
13c0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f  .  ** table.  */
13d0: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29  .  if( isIndex )
13e0: 7b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a  {.    HashElem *
13f0: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  p;.    for(p=sql
1400: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
1410: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b  chema->idxHash);
1420: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
1430: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
1440: 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49  Index *pIdx = (I
1450: 6e 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73  ndex *)sqliteHas
1460: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
1470: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
1480: 28 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20  (int)iRoot ){.  
1490: 20 20 20 20 20 20 69 54 61 62 20 3d 20 70 49 64        iTab = pId
14a0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b  x->pTable->tnum;
14b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62   }else{.    iTab
14d0: 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20   = iRoot;.  }.. 
14e0: 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
14f0: 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
1500: 2e 20 45 69 74 68 65 72 20 61 20 77 72 69 74 65  . Either a write
1510: 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61  -lock on root-pa
1520: 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a  ge iTab, a .  **
1530: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1540: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c  he schema table,
1550: 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c 69 65   or (if the clie
1560: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29 20 61  nt is reading) a
1570: 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20  .  ** read-lock 
1580: 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66  on iTab will suf
1590: 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69  fice. Return 1 i
15a0: 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61  f any of these a
15b0: 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20  re found.  */.  
15c0: 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65  for(pLock=pBtree
15d0: 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c  ->pBt->pLock; pL
15e0: 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b  ock; pLock=pLock
15f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1600: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
1610: 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20 26 26  =pBtree .     &&
1620: 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d   (pLock->iTable=
1630: 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d  =iTab || (pLock-
1640: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
1650: 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61  CK && pLock->iTa
1660: 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26  ble==1)).     &&
1670: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65   pLock->eLock>=e
1680: 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b  LockType .    ){
1690: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
16a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16b0: 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20   Failed to find 
16c0: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
16d0: 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30  k. */.  return 0
16e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16f0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f  function is also
1700: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
1710: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1720: 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20 0a 2a  ents only. It .*
1730: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
1740: 66 20 74 68 65 72 65 20 65 78 69 73 74 20 6f 6e  f there exist on
1750: 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  e or more cursor
1760: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61  s open on the ta
1770: 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f  ble .** with roo
1780: 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74 68 61  t page iRoot tha
1790: 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e 67 20  t do not belong 
17a0: 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e 65 63  to either connec
17b0: 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a 2a 20  tion pBtree .** 
17c0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f  or some other co
17d0: 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 68 61  nnection that ha
17e0: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
17f0: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2e  mitted flag set.
1800: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1810: 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69  le, before writi
1820: 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f 6f 74  ng to page iRoot
1830: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72  :.**.**    asser
1840: 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  t( !hasReadConfl
1850: 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f  icts(pBtree, iRo
1860: 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ot) );.*/.static
1870: 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66   int hasReadConf
1880: 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74  licts(Btree *pBt
1890: 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29  ree, Pgno iRoot)
18a0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
18b0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
18c0: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
18d0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
18e0: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
18f0: 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20  ot==iRoot .     
1900: 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42  && p->pBtree!=pB
1910: 74 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d  tree.     && 0==
1920: 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  (p->pBtree->db->
1930: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
1940: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a  eadUncommitted).
1950: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1960: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1970: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1980: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
19a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
19b0: 74 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20  to see if btree 
19c0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
19d0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
19e0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
19f0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
1a00: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
1a10: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
1a20: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
1a30: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
1a40: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
1a50: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
1a60: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
1a70: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1a80: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
1a90: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
1aa0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
1ab0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1ac0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
1ad0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
1ae0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
1af0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b00: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b20: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1b30: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
1b40: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
1b50: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
1b60: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
1b70: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
1b80: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
1b90: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
1ba0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1bb0: 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  )||eLock==WRITE_
1bc0: 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b  LOCK||iTab==1 );
1bd0: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75  .  .  /* If requ
1be0: 65 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  esting a write-l
1bf0: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74  ock, then the Bt
1c00: 72 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e  ree must have an
1c10: 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a   open write.  **
1c20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c30: 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20  this file. And, 
1c40: 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74  obviously, for t
1c50: 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65  his to be so the
1c60: 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  re .  ** must be
1c70: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
1c80: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1c90: 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20  e file itself.. 
1ca0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c   */.  assert( eL
1cb0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1cc0: 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74  | (p==pBt->pWrit
1cd0: 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  er && p->inTrans
1ce0: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29  ==TRANS_WRITE) )
1cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
1d00: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
1d10: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1d20: 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1d30: 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
1d40: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1d50: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1d60: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1d70: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1d80: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1d90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1da0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1db0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1dc0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1dd0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1de0: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1df0: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1e00: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1e10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1e20: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1e30: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1e40: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1e50: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1e60: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1e70: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1e80: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1e90: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1ea0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1eb0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ec0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1ed0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
1ee0: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
1ef0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
1f00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1f10: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
1f20: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
1f30: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
1f40: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f50: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
1f60: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
1f70: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
1f80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
1f90: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
1fa0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
1fb0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
1fc0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
1fd0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
1fe0: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
1ff0: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2000: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2010: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2020: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2030: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2040: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2050: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2060: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2070: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2080: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2090: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
20a0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
20b0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
20c0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
20d0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
20e0: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
20f0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2100: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2110: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2120: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2130: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2140: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2150: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2160: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2170: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2180: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
2190: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
21a0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
21b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
21c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21d0: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
21e0: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
21f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2200: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2220: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2250: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2260: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
2270: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
2280: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
2290: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
22a0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
22b0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
22c0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
22d0: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
22e0: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
22f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2300: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2310: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2320: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2330: 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63 74 69   b-tree connecti
2340: 6f 6e 20 68 61 6e 64 6c 65 20 69 73 20 63 6f 6e  on handle is con
2350: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2360: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 62 2d  able.**       b-
2370: 74 72 65 65 20 64 61 74 61 62 61 73 65 20 28 6f  tree database (o
2380: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
2390: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 29 20 66  ared.sharable) f
23a0: 6c 61 67 20 73 65 74 2c 20 61 6e 64 0a 2a 2a 0a  lag set, and.**.
23b0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
23c0: 72 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63 74  r b-tree connect
23d0: 69 6f 6e 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73  ion handle holds
23e0: 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e   a lock that con
23f0: 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20  flicts.**       
2400: 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73 74  with the request
2410: 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75  ed lock (i.e. qu
2420: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2430: 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a  bleLock() has.**
2440: 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20 62         already b
2450: 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72  een called and r
2460: 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f  eturned SQLITE_O
2470: 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  K)..**.** SQLITE
2480: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2490: 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61  if the lock is a
24a0: 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  dded successfull
24b0: 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  y. SQLITE_NOMEM 
24c0: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
24d0: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65  if a malloc atte
24e0: 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  mpt fails..*/.st
24f0: 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61 72  atic int setShar
2500: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2510: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
2520: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
2530: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2540: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
2550: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
2560: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
2570: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
2580: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2590: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
25a0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
25b0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
25c0: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
25d0: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
25e0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e   );..  /* A conn
25f0: 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  ection with the 
2600: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
2610: 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e   flag set will n
2620: 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a  ever try to.  **
2630: 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c   obtain a read-l
2640: 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66  ock using this f
2650: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c  unction. The onl
2660: 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61  y read-lock obta
2670: 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63  ined.  ** by a c
2680: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61  onnection in rea
2690: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f  d-uncommitted mo
26a0: 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c  de is on the sql
26b0: 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a  ite_master .  **
26c0: 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74   table, and that
26d0: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
26e0: 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54  d in BtreeBeginT
26f0: 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73  rans().  */.  as
2700: 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d  sert( 0==(p->db-
2710: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2720: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
2730: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2740: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
2750: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
2760: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2770: 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62   on a sharable b
2780: 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20 0a  -tree after it .
2790: 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65    ** has been de
27a0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
27b0: 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f   other b-tree ho
27c0: 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e  lds a conflictin
27d0: 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  g lock.  */.  as
27e0: 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c  sert( p->sharabl
27f0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  e );.  assert( S
2800: 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53  QLITE_OK==queryS
2810: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2820: 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65  ock(p, iTable, e
2830: 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Lock) );..  /* F
2840: 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20  irst search the 
2850: 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73  list for an exis
2860: 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69  ting lock on thi
2870: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
2880: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
2890: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
28a0: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
28b0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
28c0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
28d0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
28e0: 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p ){.      pLock
28f0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20   = pIter;.      
2900: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2910: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
2920: 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e  ove search did n
2930: 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b  ot find a BtLock
2940: 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74   struct associat
2950: 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a  ing Btree p.  **
2960: 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62   with table iTab
2970: 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  le, allocate one
2980: 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74   and link it int
2990: 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  o the list..  */
29a0: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b  .  if( !pLock ){
29b0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74  .    pLock = (Bt
29c0: 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61  Lock *)sqlite3Ma
29d0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
29e0: 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66  BtLock));.    if
29f0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
2a00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2a20: 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d   pLock->iTable =
2a30: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f   iTable;.    pLo
2a40: 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ck->pBtree = p;.
2a50: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74      pLock->pNext
2a60: 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
2a70: 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
2a80: 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pLock;.  }..  /*
2a90: 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e   Set the BtLock.
2aa0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
2ab0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  o the maximum of
2ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
2ad0: 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  k.  ** and the r
2ae0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54  equested lock. T
2af0: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77  his means if a w
2b00: 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c  rite-lock was al
2b10: 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20  ready held.  ** 
2b20: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
2b30: 72 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f  requested, we do
2b40: 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  n't incorrectly 
2b50: 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f  downgrade the lo
2b60: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ck..  */.  asser
2b70: 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45  t( WRITE_LOCK>RE
2b80: 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  AD_LOCK );.  if(
2b90: 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c   eLock>pLock->eL
2ba0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2bb0: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
2bc0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2bd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
2be0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
2bf0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
2c00: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
2c10: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
2c20: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ACHE./*.** Relea
2c30: 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  se all the table
2c40: 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62   locks (locks ob
2c50: 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73  tained via calls
2c60: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68   to.** the setSh
2c70: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2c80: 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20  ck() procedure) 
2c90: 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61  held by Btree ha
2ca0: 6e 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  ndle p..**.** Th
2cb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
2cc0: 6d 65 73 20 74 68 61 74 20 68 61 6e 64 6c 65 20  mes that handle 
2cd0: 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65  p has an open re
2ce0: 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20  ad or write .** 
2cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20  transaction. If 
2d00: 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65  it does not, the
2d10: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 69  n the BtShared.i
2d20: 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62 6c  sPending variabl
2d30: 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f  e.** may be inco
2d40: 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e  rrectly cleared.
2d50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d60: 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
2d70: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
2d80: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
2d90: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2da0: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70  t;.  BtLock **pp
2db0: 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f  Iter = &pBt->pLo
2dc0: 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ck;..  assert( s
2dd0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2de0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
2df0: 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c  sert( p->sharabl
2e00: 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20  e || 0==*ppIter 
2e10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2e20: 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20  inTrans>0 );..  
2e30: 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29  while( *ppIter )
2e40: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
2e50: 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20  ock = *ppIter;. 
2e60: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2e70: 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
2e80: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
2e90: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
2ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
2eb0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
2ec0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
2ed0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
2ee0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
2ef0: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
2f00: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
2f10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
2f20: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
2f30: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
2f40: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
2f50: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
2f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f70: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
2f80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f90: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
2fa0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
2fb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
2fc0: 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64  ert( pBt->isPend
2fd0: 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  ing==0 || pBt->p
2fe0: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
2ff0: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3000: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3010: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3020: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
3030: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
3040: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c  nding = 0;.  }el
3050: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3060: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
3070: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
3080: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
3090: 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  en connection p 
30a0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
30b0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
30c0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
30d0: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
30e0: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
30f0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3100: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3110: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3120: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3130: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3140: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3150: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3160: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
3170: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
3180: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
3190: 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20   isPending flag 
31a0: 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  to 0..    **.   
31b0: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
31c0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20  not currently a 
31d0: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53  writer, then BtS
31e0: 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20  hared.isPending 
31f0: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a  must.    ** be z
3200: 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20  ero already. So 
3210: 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69  this next line i
3220: 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68  s harmless in th
3230: 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
3240: 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69      pBt->isPendi
3250: 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ng = 0;.  }.}../
3260: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3270: 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77  on changes all w
3280: 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  rite-locks held 
3290: 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  by connection p 
32a0: 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a  to read-locks..*
32b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f  /.static void do
32c0: 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
32d0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32e0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
3300: 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  pBt;.  if( pBt->
3310: 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20  pWriter==p ){.  
3320: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b    BtLock *pLock;
3330: 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65  .    pBt->pWrite
3340: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
3350: 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b  isExclusive = 0;
3360: 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64  .    pBt->isPend
3370: 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ing = 0;.    for
3380: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
3390: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
33a0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
33b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
33c0: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
33d0: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
33e0: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
33f0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3400: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3410: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3420: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3430: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3440: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3450: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
3460: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
3470: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
3480: 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  /../*.** Verify 
3490: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
34a0: 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e  holds a mutex on
34b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f   the BtShared.*/
34c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
34d0: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
34e0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
34f0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
3500: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
3510: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
3520: 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tex);.}.#endif..
3530: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3540: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
3550: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3560: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3570: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3580: 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20  cursor pCur, if 
3590: 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  any..*/.static v
35a0: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  oid invalidateOv
35b0: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75  erflowCache(BtCu
35c0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
35d0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35e0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3600: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
3610: 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  ;.  pCur->aOverf
3620: 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  low = 0;.}../*.*
3630: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3640: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3650: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3660: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3670: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3680: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3690: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
36a0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
36b0: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
36c0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
36d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
36e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3700: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3710: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3720: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3730: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
3740: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
3750: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3760: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3770: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f  called before mo
3780: 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
3790: 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a  ents of a table.
37a0: 2a 2a 20 62 2d 74 72 65 65 20 74 6f 20 69 6e 76  ** b-tree to inv
37b0: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
37c0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
37d0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
37e0: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
37f0: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
3800: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
3810: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
3820: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
3830: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
3840: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
3850: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
3860: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
3870: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3880: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
3890: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
38a0: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
38b0: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
38c0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
38d0: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
38e0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
38f0: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
3900: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
3910: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
3920: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
3930: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
3940: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
3950: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3960: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
3970: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
3980: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3990: 74 68 69 73 20 73 70 65 63 69 66 69 63 20 72 6f  this specific ro
39a0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
39b0: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
39c0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
39d0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
39e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
39f0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
3a00: 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52  heck */.  i64 iR
3a10: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
3a20: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
3a30: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
3a40: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3a50: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3a60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3a70: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3a80: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3a90: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
3aa0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3ab0: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
3ac0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3ad0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
3ae0: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
3af0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
3b00: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
3b10: 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72     if( p->isIncr
3b20: 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 69  blobHandle && (i
3b30: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
3b40: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
3b50: 77 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  w) ){.      p->e
3b60: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
3b70: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20  NVALID;.    }.  
3b80: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 23 64 65  }.}..#else.  #de
3b90: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
3ba0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3bb0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3bc0: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3bd0: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3be0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
3bf0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c  blobCursors(x,y,
3c00: 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
3c10: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3c20: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3c30: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3c40: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3c50: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3c60: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3c70: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3c80: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3c90: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3ca0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3cb0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3cc0: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3cd0: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3ce0: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3cf0: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3d00: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3d10: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3d20: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3d30: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3d40: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3d50: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3d60: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3d70: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3d80: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3d90: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3da0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3db0: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3dc0: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3dd0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3de0: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3df0: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3e00: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3e10: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3e20: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3e30: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3e40: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3e50: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3e60: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
3e70: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
3e80: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
3e90: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
3ea0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
3eb0: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
3ec0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
3ed0: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
3ee0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
3ef0: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
3f00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3f10: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
3f20: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
3f30: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
3f40: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
3f50: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
3f60: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
3f70: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
3f80: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
3f90: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
3fa0: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
3fb0: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
3fc0: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
3fd0: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
3fe0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
3ff0: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4000: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4010: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4020: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
4030: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
4040: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
4050: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
4060: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4070: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4080: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4090: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
40a0: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
40b0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
40c0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
40d0: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
40e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
40f0: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4100: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4110: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4120: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
4130: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
4140: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
4150: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
4160: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4170: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4180: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4190: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
41a0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
41b0: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
41c0: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
41d0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
41e0: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
41f0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4200: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4210: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4220: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
4230: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
4240: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
4250: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
4260: 65 20 69 73 20 6f 6d 6d 69 74 74 65 64 20 69 66  e is ommitted if
4270: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
4280: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
4290: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
42a0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
42b0: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
42c0: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
42d0: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
42e0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
42f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4300: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4310: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
4320: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
4330: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
4340: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4350: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
4360: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  ontent ){.    in
4370: 74 20 6e 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  t nPage = 100;. 
4380: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
4390: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
43a0: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
43b0: 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
43c0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
43d0: 20 66 61 69 6c 73 20 74 68 65 72 65 20 69 73 20   fails there is 
43e0: 6e 6f 20 68 61 72 6d 20 62 65 63 61 75 73 65 20  no harm because 
43f0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 50 61 67 65  the.    ** nPage
4400: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 6e 63   variable is unc
4410: 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 74 73 20  hanged from its 
4420: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66  default value of
4430: 20 31 30 30 20 2a 2f 0a 20 20 20 20 70 42 74 2d   100 */.    pBt-
4440: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73  >pHasContent = s
4450: 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
4460: 74 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a  te((u32)nPage);.
4470: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4480: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
4490: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
44a0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
44b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
44c0: 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c  _OK && pgno<=sql
44d0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
44e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
44f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4500: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42  ite3BitvecSet(pB
4510: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20  t->pHasContent, 
4520: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
4530: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4540: 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61   Query the BtSha
4550: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4560: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  vector..**.** Th
4570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4580: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65  alled when a fre
4590: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
45a0: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
45b0: 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73   the.** free-lis
45c0: 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20  t for reuse. It 
45d0: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66  returns false if
45e0: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
45f0: 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70  etrieve the.** p
4600: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
4610: 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
4620: 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
4630: 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74  lag set. True ot
4640: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
4650: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48  ic int btreeGetH
4660: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4670: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4680: 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70  no){.  Bitvec *p
4690: 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74   = pBt->pHasCont
46a0: 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ent;.  return (p
46b0: 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65   && (pgno>sqlite
46c0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c  3BitvecSize(p) |
46d0: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
46e0: 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a  est(p, pgno)));.
46f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28  }../*.** Clear (
4700: 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53  destroy) the BtS
4710: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4720: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73  t bitvec. This s
4730: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f  hould be.** invo
4740: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
4750: 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72  usion of each wr
4760: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite-transaction.
4770: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4780: 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
4790: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
47a0: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69  Bt){.  sqlite3Bi
47b0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d  tvecDestroy(pBt-
47c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20  >pHasContent);. 
47d0: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
47e0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
47f0: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
4800: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
4810: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
4820: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
4830: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
4840: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
4850: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
4860: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
4870: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
4880: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
4890: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
48a0: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
48b0: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
48c0: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
48d0: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
48e0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
48f0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
4900: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
4910: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4920: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4930: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
4940: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
4950: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
4960: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
4970: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
4980: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
4990: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
49a0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
49b0: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
49c0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
49d0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
49e0: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
49f0: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
4a00: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
4a10: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
4a20: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
4a30: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
4a40: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
4a50: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
4a60: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
4a70: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
4a80: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
4a90: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
4aa0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
4ab0: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
4ac0: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
4ad0: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
4ae0: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
4af0: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
4b00: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
4b10: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
4b20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
4b30: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
4b40: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76  >intKey ){.    v
4b50: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
4b60: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
4b70: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
4b80: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
4b90: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4ba0: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
4bb0: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
4bc0: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
4bd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4be0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
4bf0: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
4c00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4c10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4c20: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
4c30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4c40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4c50: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4c60: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
4c70: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
4c80: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
4c90: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
4ca0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4cb0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4cc0: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
4cd0: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
4ce0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4cf0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4d00: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
4d10: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
4d20: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
4d30: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
4d40: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
4d50: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
4d60: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
4d70: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4d80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4d90: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4da0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
4db0: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
4dc0: 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e   pExcept open on
4dd0: 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77   the table .** w
4de0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
4df0: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
4e00: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
4e10: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
4e20: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
4e30: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
4e40: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
4e50: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
4e60: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
4e70: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
4e80: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
4e90: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
4ea0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
4eb0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
4ec0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
4ed0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4ee0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4ef0: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
4f00: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
4f10: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
4f20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
4f30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
4f40: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
4f50: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
4f60: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
4f70: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
4f80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
4f90: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
4fa0: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
4fb0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fc0: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
4fd0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
4fe0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
4ff0: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
5000: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5010: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5020: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
5030: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5040: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5050: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5060: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5070: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5080: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5090: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
50a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
50b0: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
50c0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
50d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
50e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
50f0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
5100: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
5110: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
5120: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
5130: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5140: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5150: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5160: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5170: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5180: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
5190: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
51a0: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
51b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
51c0: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
51d0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
51e0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
51f0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
5200: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
5210: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
5220: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
5230: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5240: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5250: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5260: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5270: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5280: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
5290: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
52a0: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
52b0: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
52c0: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
52d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
52e0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
52f0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
5300: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
5310: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
5320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5330: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5340: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5350: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5360: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5370: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5380: 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20  e[150];         
5390: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
53a0: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
53b0: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
53c0: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
53d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
53e0: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
53f0: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
5400: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
5410: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
5420: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
5430: 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20  nKey, pKey,.    
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66    aSpace, sizeof
5470: 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69  (aSpace));.    i
5480: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5490: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
54a0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
54b0: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
54c0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
54d0: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
54e0: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
54f0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
5500: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65  pRes);.  if( pKe
5510: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
5520: 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
5530: 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79  edRecord(pIdxKey
5540: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5550: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
5560: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
5570: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
5580: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
5590: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
55a0: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
55b0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
55c0: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
55d0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
55e0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
55f0: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
5600: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
5610: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
5620: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
5630: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
5640: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
5650: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5660: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
5670: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
5680: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5690: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
56a0: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
56b0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
56c0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
56d0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
56e0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
56f0: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
5700: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5710: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
5720: 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
5730: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5740: 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
5750: 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
5760: 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43  ipNext;.  }.  pC
5770: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5780: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
5790: 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
57a0: 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79  pCur, pCur->pKey
57b0: 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c  , pCur->nKey, 0,
57c0: 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74   &pCur->skipNext
57d0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
57e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
57f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5800: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
5810: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
5820: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5830: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5840: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
5850: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
5860: 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ID );.  }.  retu
5870: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
5880: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
5890: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
58a0: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
58b0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
58c0: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
58d0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
58e0: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
58f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
5900: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
5910: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
5920: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
5930: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
5940: 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20  ition it.** was 
5950: 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20  last placed at. 
5960: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
5970: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
5980: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
5990: 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65  .** at is delete
59a0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
59b0: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   them..**.** Thi
59c0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
59d0: 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  s an error code 
59e0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
59f0: 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a  s wrong.  The.**
5a00: 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f   integer *pHasMo
5a10: 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  ved is set to on
5a20: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
5a30: 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20  has moved and 0 
5a40: 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  if not..*/.int s
5a50: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
5a60: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
5a70: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
5a80: 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74  HasMoved){.  int
5a90: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73   rc;..  rc = res
5aa0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5ab0: 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
5ac0: 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  rc ){.    *pHasM
5ad0: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  oved = 1;.    re
5ae0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
5af0: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
5b00: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b10: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
5b20: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  =0 ){.    *pHasM
5b30: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  oved = 1;.  }els
5b40: 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  e{.    *pHasMove
5b50: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
5b60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5b70: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5b80: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5b90: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
5ba0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
5bb0: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
5bc0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
5bd0: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
5be0: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
5bf0: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
5c00: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
5c10: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
5c20: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
5c30: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
5c40: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
5c50: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5c60: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
5c70: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5c80: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
5c90: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
5ca0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5cb0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5cc0: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
5cd0: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
5ce0: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
5cf0: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
5d00: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
5d10: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
5d20: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
5d30: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
5d40: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
5d50: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
5d60: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
5d70: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5d80: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5d90: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
5da0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
5db0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
5dc0: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
5dd0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
5de0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
5df0: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
5e00: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
5e10: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
5e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
5e30: 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  no'..**.** If *p
5e40: 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  RC is initially 
5e50: 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51  non-zero (non-SQ
5e60: 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68  LITE_OK) then th
5e70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
5e80: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e   a no-op.  If an
5e90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5ea0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
5eb0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69  rror code is wri
5ec0: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52  tten.** into *pR
5ed0: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  C..*/.static voi
5ee0: 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  d ptrmapPut(BtSh
5ef0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5f00: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
5f10: 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20  gno parent, int 
5f20: 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20  *pRC){.  DbPage 
5f30: 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68  *pDbPage;  /* Th
5f40: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
5f50: 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ge */.  u8 *pPtr
5f60: 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  map;      /* The
5f70: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74   pointer map dat
5f80: 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  a */.  Pgno iPtr
5f90: 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  map;     /* The 
5fa0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
5fb0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
5fc0: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f   offset;       /
5fd0: 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e  * Offset in poin
5fe0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
5ff0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
6000: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6010: 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
6020: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ions */..  if( *
6030: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
6040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6050: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6060: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
6070: 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  The master-journ
6080: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d  al page number m
6090: 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65  ust never be use
60a0: 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d  d as a pointer m
60b0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73  ap page */.  ass
60c0: 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49  ert( 0==PTRMAP_I
60d0: 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49  SPAGE(pBt, PENDI
60e0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
60f0: 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  )) );..  assert(
6100: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
6110: 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30   );.  if( key==0
6120: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6130: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6140: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
6150: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
6160: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
6170: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
6180: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
6190: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
61a0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
61b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
61c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
61d0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
61e0: 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20  n;.  }.  offset 
61f0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6200: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6210: 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30  ;.  if( offset<0
6220: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
6230: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6240: 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72  PT;.    goto ptr
6250: 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  map_exit;.  }.  
6260: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6270: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6280: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
6290: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
62a0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
62b0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
62c0: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
62d0: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
62e0: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
62f0: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
6300: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
6310: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
6320: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
6330: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
6340: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
6350: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6360: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
6370: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
6380: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
6390: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
63a0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
63b0: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
63c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
63d0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
63e0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
63f0: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
6400: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6420: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
6430: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6440: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
6450: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
6460: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
6470: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
6480: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
6490: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
64a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
64b0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
64c0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
64d0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
64e0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
64f0: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
6500: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6510: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
6520: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
6530: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
6540: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
6550: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6560: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
6570: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6580: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
6590: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
65a0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
65b0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
65c0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
65d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
65e0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
65f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
6600: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6610: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6620: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6630: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
6640: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6650: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6660: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6670: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6680: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6690: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
66a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
66b0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
66c0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
66d0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
66e0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
66f0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
6700: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6720: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6730: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6740: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6750: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6760: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6770: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6780: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6790: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
67a0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
67b0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
67c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
67d0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
67e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
67f0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
6800: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6810: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6820: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6830: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
6840: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
6850: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6860: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6870: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
6880: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
6890: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
68a0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
68b0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
68c0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
68d0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
68e0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
68f0: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
6900: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
6910: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6920: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
6930: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6940: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
6950: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
6960: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
6970: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
6980: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
6990: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
69a0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
69b0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
69c0: 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29  (&(P)->aData[(P)
69d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28  ->cellOffset+2*(
69e0: 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  I)])))../*.** Th
69f0: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
6a00: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
6a10: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
6a20: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
6a30: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
6a40: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
6a50: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
6a60: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
6a70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
6a80: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
6a90: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
6aa0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6ab0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
6ac0: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
6ad0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
6ae0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6af0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
6b00: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
6b10: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
6b20: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
6b30: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
6b40: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
6b50: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
6b60: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
6b70: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
6b80: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
6b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
6ba0: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
6bb0: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
6bc0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
6bd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
6be0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
6bf0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
6c00: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
6c10: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
6c20: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
6c30: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
6c40: 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72  ction.  btreePar
6c50: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
6c60: 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20   .** cell index 
6c70: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6c80: 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65  gument and btree
6c90: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
6ca0: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
6cb0: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
6cc0: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
6cd0: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
6ce0: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
6cf0: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
6d00: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
6d10: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
6d20: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72  nstead of.** btr
6d30: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
6d40: 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d  . Using some com
6d50: 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c  pilers, this wil
6d60: 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a  l be faster..*/.
6d70: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
6d80: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
6d90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6db0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6dc0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
6dd0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
6de0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
6df0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
6e00: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
6e10: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
6e20: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
6e30: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31  cture */.){.  u1
6e40: 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 n;            
6e50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6e60: 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f  bytes in cell co
6e70: 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a  ntent header */.
6e80: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
6e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6ea0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
6eb0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
6ec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6ed0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6ee0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6ef0: 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43   );..  pInfo->pC
6f00: 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61  ell = pCell;.  a
6f10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
6f20: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
6f30: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d  leaf==1 );.  n =
6f40: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
6f50: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
6f60: 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65  n==4-4*pPage->le
6f70: 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  af );.  if( pPag
6f80: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
6f90: 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
6fa0: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ata ){.      n +
6fb0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
6fc0: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
6fd0: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
6fe0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
6ff0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b  0;.    }.    n +
7000: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  = getVarint(&pCe
7010: 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[n], (u64*)&pI
7020: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20  nfo->nKey);.    
7030: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e  pInfo->nData = n
7040: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
7050: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  {.    pInfo->nDa
7060: 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d  ta = 0;.    n +=
7070: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43   getVarint32(&pC
7080: 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64  ell[n], nPayload
7090: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
70a0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
70b0: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
70c0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
70d0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65  .  pInfo->nHeade
70e0: 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73  r = n;.  testcas
70f0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
7100: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7110: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
7120: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
7130: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7140: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
7150: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
7160: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
7170: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
7180: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
7190: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
71a0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
71b0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
71c0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
71d0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
71e0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
71f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
7200: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
7210: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
7220: 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65  tes */.    nSize
7230: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
7240: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
7250: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
7260: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
7270: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7280: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
7290: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
72a0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
72b0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
72c0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
72d0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
72e0: 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a  Size = (u16)nSiz
72f0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
7300: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
7310: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
7320: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
7330: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
7340: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
7350: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
7360: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
7370: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
7380: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
7390: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
73a0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
73b0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
73c0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
73d0: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
73e0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
73f0: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
7400: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
7410: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
7420: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
7430: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
7440: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
7450: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
7460: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
7470: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7480: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
7490: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
74a0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
74b0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
74c0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
74d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
74e0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
74f0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7500: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7510: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
7520: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
7530: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
7540: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
7550: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
7560: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
7570: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
7580: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
7590: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
75a0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
75b0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
75c0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
75d0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
75e0: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
75f0: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
7600: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
7610: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7620: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
7630: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
7640: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
7650: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7660: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
7670: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
7680: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
7690: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
76a0: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
76b0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
76c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
76d0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
76e0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
76f0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7700: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
7710: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
7720: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
7730: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
7740: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
7750: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
7760: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
7770: 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  \.  btreeParseCe
7780: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
7790: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
77a0: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
77b0: 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  o)).static void 
77c0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
77d0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
77e0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
77f0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7800: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
7810: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7820: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
7830: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
7840: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
7850: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
7860: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
7870: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7880: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
7890: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
78a0: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
78b0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
78c0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
78d0: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
78e0: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
78f0: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
7900: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
7910: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
7920: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
7930: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
7940: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
7950: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
7960: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
7970: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
7980: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
7990: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
79a0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
79b0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
79c0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
79d0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
79e0: 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e  = &pCell[pPage->
79f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
7a00: 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66   u32 nSize;..#if
7a10: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
7a20: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
7a30: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
7a40: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
7a50: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
7a60: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
7a70: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
7a80: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
7a90: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
7aa0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
7ab0: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
7ac0: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
7ad0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
7ae0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
7af0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
7b00: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
7b10: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
7b20: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
7b30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
7b40: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
7b50: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
7b60: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
7b70: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
7b80: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7b90: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
7ba0: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
7bb0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
7bc0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7bd0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7be0: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
7bf0: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
7c00: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7c10: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
7c20: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
7c30: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
7c40: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
7c50: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
7c60: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
7c70: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
7c80: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
7c90: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
7ca0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
7cb0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
7cc0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
7cd0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
7ce0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
7cf0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
7d00: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
7d10: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
7d20: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7d30: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
7d40: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  }..  testcase( n
7d50: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7d60: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
7d70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7d90: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
7da0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
7db0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7dc0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7dd0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
7de0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
7df0: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
7e00: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7e10: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7e20: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7e30: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7e40: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
7e50: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7e60: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
7e70: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
7e80: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7e90: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
7ea0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7eb0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
7ec0: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
7ed0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
7ee0: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
7ef0: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
7f00: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
7f10: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
7f20: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
7f30: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
7f40: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
7f50: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
7f60: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
7f70: 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ze;.}.#ifndef ND
7f80: 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20  EBUG.static u16 
7f90: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
7fa0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7fb0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
7fc0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7fd0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
7fe0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
7ff0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
8000: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
8010: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8020: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8030: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8040: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8050: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8060: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8070: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8080: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
8090: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
80a0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
80b0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
80c0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
80d0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
80e0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
80f0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
8100: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8110: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8120: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8130: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8140: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8150: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8160: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8170: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8180: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
8190: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
81a0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
81b0: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
81c0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
81d0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
81e0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
81f0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
8200: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
8210: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8220: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8230: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8240: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8250: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8260: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8270: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8280: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
8290: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
82a0: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
82b0: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
82c0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
82d0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
82e0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
82f0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
8300: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8310: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8320: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8330: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8340: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8370: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8390: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
83a0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
83b0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
83d0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
83e0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
83f0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
8400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8410: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8420: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8440: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8450: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8460: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8470: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8480: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8490: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
84a0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
84b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
84c0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
84d0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
84e0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
84f0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
8500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8510: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8520: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8530: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8540: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8550: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8560: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8570: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8580: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
8590: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
85a0: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
85c0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
85d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
85e0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
85f0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
8600: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
8610: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8620: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8630: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8640: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8650: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8660: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8670: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8680: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
8690: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
86a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
86b0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
86c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
86d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
86e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
86f0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8700: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8710: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8720: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8730: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8740: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8750: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8760: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8770: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8780: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8790: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
87a0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
87b0: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
87c0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
87d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
87e0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
87f0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8800: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8810: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8820: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8830: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8840: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8850: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8860: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8870: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8880: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8890: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
88a0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
88b0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
88c0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
88d0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
88e0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
88f0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8900: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8910: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8920: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8930: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8940: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8950: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8960: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8970: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8980: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8990: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
89a0: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
89b0: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
89c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
89d0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
89e0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
89f0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8a00: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8a10: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8a20: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8a30: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8a40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8a50: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8a60: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8a70: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8a80: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8a90: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8aa0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8ab0: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ac0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8ad0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8ae0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8af0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8b00: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8b10: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8b20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8b30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8b40: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8b50: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8b60: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8b70: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8b80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b90: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8ba0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8bb0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8bc0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8bd0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8be0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8bf0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8c00: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8c10: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
8c20: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8c30: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8c40: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8c50: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8c60: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8c70: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8c80: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
8c90: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
8ca0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
8cb0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
8cc0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
8cd0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
8ce0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
8cf0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
8d00: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
8d10: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
8d20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8d30: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8d40: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8d50: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
8d60: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
8d70: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
8d80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8d90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
8da0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8db0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
8dc0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
8dd0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
8de0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
8df0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
8e00: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
8e10: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
8e20: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
8e30: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
8e40: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
8e50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
8e60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
8e70: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
8e80: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
8e90: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
8ea0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
8eb0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
8ec0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
8ed0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
8ee0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
8ef0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
8f00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
8f10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
8f20: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
8f30: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
8f40: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
8f50: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
8f60: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
8f70: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
8f80: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
8f90: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
8fa0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
8fb0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
8fc0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
8fd0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
8fe0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
8ff0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
9000: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
9010: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9020: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9030: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9040: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9050: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9060: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9070: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9080: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
9090: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
90a0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
90b0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
90c0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
90d0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
90e0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
90f0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
9100: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9110: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9120: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9150: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9160: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9170: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9190: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
91a0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
91b0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
91c0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
91d0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
91e0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
91f0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
9200: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
9210: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9220: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9230: 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  de */.  .  asser
9240: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9250: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9260: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9270: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9280: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
9290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
92a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
92b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
92c0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
92d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
92e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
92f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9300: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9310: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9320: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9330: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3c 70   assert( nByte<p
9340: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
9350: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9360: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9370: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9380: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9390: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
93a0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
93b0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
93c0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
93d0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
93e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
93f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20  [hdr+5]);.  if( 
9400: 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75 72 6e  gap>top ) return
9410: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9420: 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61 73 65  BKPT;.  testcase
9430: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
9440: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
9450: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
9460: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
9470: 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  ;..  if( nFrag>=
9480: 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77  60 ){.    /* Alw
9490: 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20 68  ays defragment h
94a0: 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65 64  ighly fragmented
94b0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 63   pages */.    rc
94c0: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
94d0: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
94e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
94f0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
9500: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9510: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9520: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9530: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9540: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9550: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9560: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9570: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9580: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9590: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
95a0: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
95b0: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
95c0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
95d0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
95e0: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
95f0: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
9600: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
9610: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
9620: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
9630: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
9640: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
9650: 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67      int size = g
9660: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
9670: 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a  +2]);     /* Siz
9680: 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a  e of free slot *
9690: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  /.      if( size
96a0: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
96b0: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
96c0: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
96d0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
96e0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
96f0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
9700: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
9710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
9720: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
9730: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
9740: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
9750: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  er of.          
9760: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
9770: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
9780: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
9790: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
97a0: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
97b0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
97c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38  ata[hdr+7] = (u8
97d0: 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20  )(nFrag + x);.  
97e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
97f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
9800: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
9810: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
9820: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
9830: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
9840: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
9850: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
9860: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
9870: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75   */.          pu
9880: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
9890: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  2], x);.        
98a0: 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20  }.        *pIdx 
98b0: 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  = pc + x;.      
98c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
98d0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
98e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
98f0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
9900: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
9910: 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20  pace in the gap 
9920: 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20  to satisfy.  ** 
9930: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  the allocation. 
9940: 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d   If not, defragm
9950: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ent..  */.  test
9960: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
9970: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
9980: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
9990: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  ){.    rc = defr
99a0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
99b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
99c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
99d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
99e0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
99f0: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
9a00: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
9a10: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
9a20: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
9a30: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
9a40: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9a50: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
9a60: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9a70: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
9a80: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
9a90: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
9aa0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
9ab0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
9ac0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
9ad0: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
9ae0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
9af0: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
9b00: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
9b10: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
9b20: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
9b30: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
9b40: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
9b50: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
9b60: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
9b70: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
9b80: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
9b90: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
9ba0: 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65  p+nByte <= pPage
9bb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9bc0: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
9bd0: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
9be0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9bf0: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
9c00: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
9c10: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
9c20: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
9c30: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
9c40: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
9c50: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
9c60: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
9c70: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
9c80: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
9c90: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
9ca0: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
9cb0: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
9cc0: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
9cd0: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
9ce0: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
9cf0: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
9d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
9d10: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
9d20: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61   *pPage, int sta
9d30: 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  rt, int size){. 
9d40: 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69   int addr, pbegi
9d50: 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c  n, hdr;.  int iL
9d60: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9d80: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
9d90: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
9da0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9db0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
9dc0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
9dd0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
9de0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9df0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9e00: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9e10: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9e20: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
9e30: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
9e40: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9e50: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
9e60: 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d  (start + size)<=
9e70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9e80: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
9e90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9ea0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9eb0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9ec0: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
9ed0: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
9ee0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
9ef0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9f00: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
9f10: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
9f20: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
9f30: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
9f40: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
9f50: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
9f60: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
9f70: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
9f80: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
9f90: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
9fa0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
9fb0: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
9fc0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
9fd0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
9fe0: 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  s.  Note that.  
9ff0: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  ** even though t
a000: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
a010: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
a020: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a030: 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74  ,.  ** btreeInit
a040: 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20 64  Page() did not d
a050: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69 6e  etect overlappin
a060: 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20  g cells or.  ** 
a070: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
a080: 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c 73  overlapped cells
a090: 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  .   Nor does it 
a0a0: 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65 0a  detect when the.
a0b0: 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e    ** cell conten
a0c0: 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20 74  t area exceeds t
a0d0: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
a0e0: 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49 66  page header.  If
a0f0: 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74 75   these.  ** situ
a100: 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74 68  ations arise, th
a110: 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  en subsequent in
a120: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
a130: 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20 20  might corrupt.  
a140: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a150: 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64 20    So we do need 
a160: 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 72  to check for cor
a170: 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73 63  ruption while sc
a180: 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anning.  ** the 
a190: 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
a1a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
a1b0: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
a1c0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61  = hdr + 1;.  iLa
a1d0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
a1e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
a1f0: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
a200: 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68 69  <=iLast );.  whi
a210: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
a220: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a230: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
a240: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  egin>0 ){.    if
a250: 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34 20  ( pbegin<addr+4 
a260: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a270: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a280: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
a290: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
a2a0: 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e 69  }.  if( pbegin>i
a2b0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Last ){.    retu
a2c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a2d0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
a2e0: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
a2f0: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
a300: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a310: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
a320: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a330: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
a340: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
a350: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
a360: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
a370: 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46  Free = pPage->nF
a380: 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b  ree + (u16)size;
a390: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
a3a0: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
a3b0: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
a3c0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
a3d0: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
a3e0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a3f0: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ]))>0 ){.    int
a400: 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78   pnext, psize, x
a410: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a420: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
a430: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
a440: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a450: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
a460: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
a470: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
a480: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
a490: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a4a0: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
a4b0: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
a4c0: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
a4d0: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
a4e0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
a4f0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
a500: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66  e);.      if( (f
a510: 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e  rag<0) || (frag>
a520: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
a530: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
a540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a550: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
a560: 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b  .      data[hdr+
a570: 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a  7] -= (u8)frag;.
a580: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
a590: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
a5a0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a5b0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
a5c0: 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e  x);.      x = pn
a5d0: 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26  ext + get2byte(&
a5e0: 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d  data[pnext+2]) -
a5f0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70   pbegin;.      p
a600: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
a610: 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  egin+2], x);.   
a620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
a630: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
a640: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
a650: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
a660: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
a670: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
a680: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
a690: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
a6a0: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
a6b0: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
a6c0: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
a6d0: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
a6e0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a6f0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
a700: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
a710: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
a720: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
a730: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a740: 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32  a[hdr+5]) + get2
a750: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a760: 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  n+2]);.    put2b
a770: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a780: 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73  , top);.  }.  as
a790: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
a7a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
a7b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
a7c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a7d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
a7e0: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
a7f0: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
a800: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
a810: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
a820: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
a830: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
a840: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
a850: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
a860: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
a870: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
a880: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
a890: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
a8a0: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
a8b0: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
a8c0: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
a8d0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
a8e0: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
a8f0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
a900: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
a910: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
a920: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
a930: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
a940: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a950: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
a960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
a970: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
a980: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
a990: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
a9a0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
a9b0: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
a9c0: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
a9d0: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
a9e0: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
a9f0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
aa00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
aa10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
aa20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
aa30: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
aa40: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
aa50: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
aa60: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
aa70: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
aa80: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
aa90: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
aaa0: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
aab0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
aac0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
aad0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
aae0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
aaf0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
ab00: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ab10: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
ab20: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
ab30: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
ab40: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
ab50: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
ab60: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
ab70: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
ab80: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
ab90: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
aba0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
abb0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
abc0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
abd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
abe0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
abf0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
ac00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ac10: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ac20: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ac30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ac40: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
ac50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ac60: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
ac70: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
ac80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
ac90: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
aca0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
acb0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
acc0: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
acd0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
ace0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
acf0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
ad00: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
ad10: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
ad20: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
ad30: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
ad40: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
ad50: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
ad60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ad70: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
ad80: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
ad90: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
ada0: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
adb0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
adc0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
add0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
ade0: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
adf0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
ae00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ae10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ae20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
ae30: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
ae40: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
ae50: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
ae60: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
ae70: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ae80: 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
ae90: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
aea0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
aeb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aec0: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
aed0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
aee0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
aef0: 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
af00: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
af10: 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20  u16 pc;         
af20: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
af30: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
af40: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
af50: 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72  [] */.    u8 hdr
af60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
af70: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
af80: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
af90: 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61  er */.    u8 *da
afa0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
afb0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
afc0: 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53  aData */.    BtS
afd0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
afe0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
aff0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
b000: 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c 65  /.    u16 usable
b010: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
b020: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
b030: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
b040: 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  */.    u16 cellO
b050: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
b060: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
b070: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
b080: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
b090: 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20 20      u16 nFree;  
b0a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b0b0: 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
b0c0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b0d0: 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20 20      u16 top;    
b0e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b0f0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
b100: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
b110: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  .    int iCellFi
b120: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
b130: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b140: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
b150: 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  set */.    int i
b160: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
b170: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
b180: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
b190: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20   offset */..    
b1a0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
b1b0: 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  ;..    hdr = pPa
b1c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1d0: 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
b1e0: 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  >aData;.    if( 
b1f0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
b200: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20  e, data[hdr]) ) 
b210: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b220: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
b230: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
b240: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
b250: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
b260: 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  68 );.    pPage-
b270: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d  >maskPage = pBt-
b280: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20  >pageSize - 1;. 
b290: 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
b2a0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61  low = 0;.    usa
b2b0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
b2c0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70  sableSize;.    p
b2d0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
b2e0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
b2f0: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
b300: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f  ge->leaf;.    to
b310: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
b320: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
b330: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
b340: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b350: 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  r+3]);.    if( p
b360: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
b370: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
b380: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
b390: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
b3a0: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
b3b0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
b3c0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
b3d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b3e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  KPT;.    }.    t
b3f0: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
b400: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
b410: 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  Bt) );..    /* A
b420: 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
b430: 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
b440: 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
b450: 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20  past the end.   
b460: 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
b470: 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
b480: 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
b490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
b4a0: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
b4b0: 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
b4c0: 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
b4d0: 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  ds.    ** past t
b4e0: 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
b4f0: 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
b500: 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
b510: 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  UPT to be .    *
b520: 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
b530: 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   does..    */.  
b540: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b550: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
b560: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
b570: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
b580: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20  leSize - 4;.#if 
b590: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
b5a0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
b5b0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b  ELL_CHECK).    {
b5c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
b5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
b5e0: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
b5f0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
b600: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
b610: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b620: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
b630: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
b640: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
b650: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
b660: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
b670: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
b680: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
b690: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
b6a0: 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*2]);.        
b6b0: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
b6c0: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
b6d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6e0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
b6f0: 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43         if( pc<iC
b700: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
b710: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
b720: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b730: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b740: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b750: 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
b760: 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74  ePtr(pPage, &dat
b770: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20  a[pc]);.        
b780: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
b790: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
b7a0: 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a         if( pc+sz
b7b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
b7c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b7d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b7e0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
b7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b800: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
b810: 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20  iCellLast++;.   
b820: 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20   }  .#endif..   
b830: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
b840: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
b850: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b860: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
b870: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
b880: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
b890: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a  a[hdr+7] + top;.
b8a0: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
b8b0: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
b8c0: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
b8d0: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
b8e0: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
b8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
b900: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
b910: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
b920: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b930: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b940: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
b950: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
b960: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
b970: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
b980: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
b990: 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30        if( next>0
b9a0: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
b9b0: 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e+3 ){.        /
b9c0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
b9d0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
b9e0: 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ng order */.    
b9f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ba00: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
ba10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
ba20: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
ba30: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
ba40: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
ba50: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
ba60: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
ba70: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
ba80: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
ba90: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
baa0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
bab0: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
bac0: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
bad0: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
bae0: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
baf0: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
bb00: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
bb10: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
bb20: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
bb30: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
bb40: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
bb50: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
bb60: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
bb70: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
bb80: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
bb90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
bba0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
bbb0: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
bbc0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
bbd0: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
bbe0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
bbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
bc00: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
bc10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
bc20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bc30: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
bc40: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
bc50: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
bc60: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
bc70: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
bc80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
bc90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
bca0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
bcb0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
bcc0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
bcd0: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
bce0: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
bcf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
bd00: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
bd10: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
bd20: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
bd30: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
bd40: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
bd50: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
bd60: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
bd70: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
bd80: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
bd90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
bda0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
bdb0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
bdc0: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
bdd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
bde0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
bdf0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
be00: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
be10: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
be20: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
be30: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
be40: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
be50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
be60: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
be70: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
be80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
be90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
bea0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
beb0: 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61    /*memset(&data
bec0: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
bed0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
bee0: 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20  ;*/.  data[hdr] 
bef0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
bf00: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
bf10: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
bf20: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
bf30: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
bf40: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
bf50: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
bf60: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
bf70: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
bf80: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
bf90: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
bfa0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
bfb0: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
bfc0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
bfd0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
bfe0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
bff0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c000: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c010: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c020: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
c030: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
c040: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
c050: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
c060: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
c070: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c080: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c090: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
c0a0: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
c0b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
c0c0: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
c0d0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
c0e0: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
c0f0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
c100: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
c110: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
c120: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c130: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
c140: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
c150: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
c160: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
c170: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
c180: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c190: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c1a0: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c1b0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c1c0: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c1d0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c1e0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c1f0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c200: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c210: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c220: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c230: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
c240: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
c250: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c260: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c270: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c280: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c290: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c2a0: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c2b0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
c2c0: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
c2d0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
c2e0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
c2f0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
c300: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
c310: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
c320: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
c330: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
c340: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
c350: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
c360: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
c370: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
c380: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
c390: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
c3a0: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
c3b0: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
c3c0: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
c3d0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
c3e0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
c3f0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
c400: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
c410: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
c420: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
c430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c440: 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
c450: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c460: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
c470: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c480: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c490: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c4a0: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
c4b0: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c4c0: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
c4d0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
c4e0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
c4f0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
c500: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
c510: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
c520: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
c530: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
c540: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
c550: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c560: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c570: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
c580: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
c590: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
c5a0: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
c5b0: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
c5c0: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
c5d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
c5e0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
c5f0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c600: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c610: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c620: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
c630: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
c640: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
c650: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
c660: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
c670: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
c680: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
c690: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
c6a0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c6b0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c6c0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c6d0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c6e0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c6f0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
c700: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
c710: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
c720: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
c730: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c740: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c750: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
c760: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
c770: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
c780: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
c790: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
c7a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
c7b0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c7c0: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
c7d0: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
c7e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
c7f0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
c800: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c810: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
c820: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
c830: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
c840: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
c850: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
c860: 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61  tic Pgno pagerPa
c870: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
c880: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50   *pBt){.  int nP
c890: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  age = -1;.  int 
c8a0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rc;.  assert( pB
c8b0: 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72  t->pPage1 );.  r
c8c0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c8d0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
c8e0: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
c8f0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
c900: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65  LITE_OK || nPage
c910: 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==-1 );.  return
c920: 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a   (Pgno)nPage;.}.
c930: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
c940: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
c950: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
c960: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
c970: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
c980: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
c990: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
c9a0: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
c9b0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
c9c0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
c9d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
c9e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
c9f0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
ca00: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
ca10: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
ca20: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
ca30: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
ca40: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
ca50: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
ca60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
ca70: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
ca80: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
ca90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
caa0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
cab0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
cac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cad0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
cae0: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
caf0: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
cb00: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
cb10: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
cb20: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 45  {.  int rc;.  TE
cb30: 53 54 4f 4e 4c 59 28 20 50 67 6e 6f 20 69 4c 61  STONLY( Pgno iLa
cb40: 73 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65  stPg = pagerPage
cb50: 63 6f 75 6e 74 28 70 42 74 29 3b 20 29 0a 20 20  count(pBt); ).  
cb60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cb70: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cb80: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20  mutex) );..  rc 
cb90: 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
cba0: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
cbb0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
cbc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cbd0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
cbe0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
cbf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cc00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
cc10: 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
cc20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
cc30: 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  /* If the reques
cc40: 74 65 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ted page number 
cc50: 77 61 73 20 65 69 74 68 65 72 20 30 20 6f 72 20  was either 0 or 
cc60: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
cc70: 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
cc80: 72 20 6f 66 20 74 68 65 20 6c 61 73 74 20 70 61  r of the last pa
cc90: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
cca0: 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
ccb0: 6e 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a  n should return.
ccc0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    ** SQLITE_CORR
ccd0: 55 50 54 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  UPT or some othe
cce0: 72 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 53 51  r error (i.e. SQ
ccf0: 4c 49 54 45 5f 46 55 4c 4c 29 2e 20 43 68 65 63  LITE_FULL). Chec
cd00: 6b 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  k that this.  **
cd10: 20 69 73 20 74 68 65 20 63 61 73 65 2e 20 20 2a   is the case.  *
cd20: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 67 6e  /.  assert( (pgn
cd30: 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 69 4c 61  o>0 && pgno<=iLa
cd40: 73 74 50 67 29 20 7c 7c 20 72 63 21 3d 53 51 4c  stPg) || rc!=SQL
cd50: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 74 65 73 74  ITE_OK );.  test
cd60: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
cd70: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
cd80: 6f 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 0a 20  o==iLastPg );.. 
cd90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
cda0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
cdb0: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
cdc0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
cdd0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
cde0: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
cdf0: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
ce00: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
ce10: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
ce20: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
ce30: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
ce40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
ce50: 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  low==0 || sqlite
ce60: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
ce70: 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  nt(pPage->pDbPag
ce80: 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65  e)>1 );.    asse
ce90: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
cea0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ceb0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
cec0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ced0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
cee0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
cef0: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
cf00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
cf10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
cf20: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
cf30: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
cf40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
cf50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
cf60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
cf70: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
cf80: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
cf90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
cfa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
cfb0: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
cfc0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
cfd0: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
cfe0: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
cff0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
d000: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
d010: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
d020: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
d030: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
d040: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
d050: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
d060: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
d070: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
d080: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
d090: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
d0a0: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
d0b0: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
d0c0: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
d0d0: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
d0e0: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
d0f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
d100: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
d110: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
d120: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
d130: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
d140: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
d150: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
d160: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d170: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
d180: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
d190: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
d1a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
d1b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d1c0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
d1d0: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
d1e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
d1f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
d200: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
d210: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
d220: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
d230: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
d240: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
d250: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
d260: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
d270: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
d280: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
d290: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
d2a0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
d2b0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
d2c0: 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
d2d0: 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
d2e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
d2f0: 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
d300: 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
d310: 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
d320: 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
d330: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
d340: 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
d350: 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
d360: 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
d370: 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
d380: 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
d390: 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
d3a0: 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
d3b0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
d3c0: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
d3d0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
d3e0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
d3f0: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
d400: 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
d410: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
d420: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d430: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
d440: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
d450: 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
d460: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
d470: 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
d480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d490: 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
d4a0: 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
d4b0: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
d4c0: 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
d4d0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
d4e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
d4f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
d500: 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
d510: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
d520: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d530: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
d540: 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77  is NULL.** a new
d550: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
d560: 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20   random name is 
d570: 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72  created.  This r
d580: 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a  andomly named.**
d590: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
d5a0: 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77  ill be deleted w
d5b0: 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
d5c0: 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
d5d0: 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  d..** If zFilena
d5e0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
d5f0: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
d600: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
d610: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
d620: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
d630: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
d640: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
d650: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
d660: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
d670: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
d680: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d690: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
d6a0: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
d6b0: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
d6c0: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
d6d0: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
d6e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
d6f0: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
d700: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
d710: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
d720: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
d730: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d740: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
d750: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
d760: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
d770: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
d780: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
d790: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
d7a0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
d7b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
d7c0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
d7d0: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
d7e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
d7f0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
d800: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
d810: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
d820: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
d830: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
d840: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
d850: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
d860: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
d870: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
d880: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
d890: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
d8a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
d8b0: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
d8c0: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
d8d0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
d8e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
d8f0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
d900: 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73  /* The VFS to us
d910: 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65  e for this btree
d920: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
d930: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
d940: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
d950: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
d960: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
d970: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
d990: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
d9a0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
d9b0: 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
d9c0: 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
d9d0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
d9e0: 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
d9f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
da00: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
da10: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
da20: 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
da30: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
da40: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
da50: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
da60: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
da70: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
da80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
da90: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
daa0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
dab0: 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
dac0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
dad0: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
dae0: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
daf0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
db00: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
db10: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
db20: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
db30: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
db40: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
db50: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
db60: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
db70: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
db80: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
db90: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
dba0: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
dbb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dbc0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
dbd0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
dbe0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
dbf0: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
dc00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
dc10: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
dc20: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
dc30: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
dc40: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
dc50: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
dc60: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
dc70: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
dc80: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
dc90: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
dca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dcb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
dcc0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
dcd0: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
dce0: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
dcf0: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
dd00: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
dd10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
dd20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
dd30: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
dd40: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
dd50: 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66  db = db;.#ifndef
dd60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
dd70: 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c  RED_CACHE.  p->l
dd80: 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ock.pBtree = p;.
dd90: 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65    p->lock.iTable
dda0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69   = 1;.#endif..#i
ddb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ddc0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
ddd0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
dde0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
ddf0: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
de00: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
de10: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
de20: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
de30: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
de40: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
de50: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
de60: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
de70: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d  h.  */.  if( isM
de80: 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65  emdb==0 && zFile
de90: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
dea0: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  e[0] ){.    if( 
deb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
dec0: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
ded0: 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  nabled ){.      
dee0: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
def0: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
df00: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
df10: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
df20: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
df30: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
df40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
df50: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
df60: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
df70: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
df80: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
df90: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
dfa0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
dfb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
dfc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dfd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
dfe0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
dff0: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e000: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e010: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e020: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
e030: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e040: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e050: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
e060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e070: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
e080: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
e090: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
e0a0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e0b0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
e0c0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
e0d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e0e0: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
e0f0: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
e100: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e110: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e120: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
e130: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
e140: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e150: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
e160: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
e170: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
e180: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
e190: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
e1a0: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
e1b0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
e1c0: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
e1d0: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
e1e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
e1f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
e200: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
e210: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
e220: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
e230: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
e240: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
e250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
e260: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
e270: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
e280: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
e290: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e2a0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
e2b0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
e2c0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e2d0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
e2e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e2f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
e300: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e310: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e320: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
e330: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
e340: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
e350: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
e360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
e370: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
e380: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
e390: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
e3a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e3b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e3c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
e3d0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e3e0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
e3f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
e400: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e410: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
e420: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
e430: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
e440: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
e450: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
e460: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
e470: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
e480: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
e490: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
e4a0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
e4b0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
e4c0: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
e4d0: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
e4e0: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
e4f0: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
e500: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e510: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
e520: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
e530: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
e540: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
e550: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
e560: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
e570: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
e580: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
e590: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
e5a0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
e5b0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
e5c0: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
e5d0: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
e5e0: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
e5f0: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
e600: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
e610: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
e620: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
e630: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
e640: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
e650: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
e660: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e670: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
e680: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
e690: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e6a0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
e6b0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
e6c0: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
e6d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
e6e0: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
e6f0: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
e700: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
e710: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e720: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
e730: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
e740: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
e750: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e760: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e770: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e780: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e790: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
e7a0: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
e7b0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
e7e0: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
e7f0: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
e800: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e810: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
e820: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
e830: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
e840: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
e850: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
e860: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
e870: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
e890: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e8a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
e8b0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
e8c0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
e8d0: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
e8e0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
e8f0: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
e900: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
e910: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
e920: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
e930: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
e940: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
e950: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
e960: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
e970: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
e980: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
e990: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
e9a0: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
e9b0: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
e9c0: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
e9d0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
e9e0: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
e9f0: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
ea00: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
ea10: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
ea20: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
ea30: 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
ea40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
ea50: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
ea60: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
ea70: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
ea80: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
ea90: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
eaa0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
eab0: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
eac0: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
ead0: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
eae0: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
eaf0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
eb00: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
eb10: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
eb20: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
eb30: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
eb40: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
eb50: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
eb60: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
eb70: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
eb80: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
eb90: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
eba0: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
ebb0: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
ebc0: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
ebd0: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
ebe0: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
ebf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
ec00: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
ec10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
ec20: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
ec30: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
ec40: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
ec50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ec60: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
ec70: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
ec80: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
ec90: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
eca0: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
ecb0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
ecc0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
ecd0: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
ece0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ecf0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ed00: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
ed10: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ed20: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
ed30: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
ed40: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ed50: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
ed60: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
ed70: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
ed80: 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
ed90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
eda0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
edb0: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
edc0: 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
edd0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
ede0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
edf0: 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
ee00: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
ee10: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
ee20: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
ee30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
ee40: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
ee50: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
ee60: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
ee70: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ee80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ee90: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
eea0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
eeb0: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
eec0: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
eed0: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
eee0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
eef0: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
ef00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ef10: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
ef20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ef30: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
ef40: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
ef50: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
ef60: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
ef70: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ef80: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ef90: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
efa0: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
efb0: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
efc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
efd0: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
efe0: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
eff0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
f000: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
f010: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
f020: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
f030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
f040: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f050: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
f060: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
f070: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
f080: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f090: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f0a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
f0b0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
f0c0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
f0d0: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
f0e0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f0f0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f100: 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
f110: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f120: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f130: 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
f140: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f150: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
f160: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
f170: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
f180: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
f190: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
f1a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f1b0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
f1c0: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
f1d0: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
f1e0: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
f1f0: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
f200: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
f210: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
f220: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
f230: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
f240: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
f250: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
f260: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
f270: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
f280: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f290: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
f2a0: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
f2b0: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
f2c0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f2d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f2e0: 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
f2f0: 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
f300: 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
f310: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
f320: 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
f330: 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
f340: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
f350: 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
f360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
f370: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
f380: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
f390: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
f3a0: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
f3b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f3c0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
f3d0: 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
f3e0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
f3f0: 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
f400: 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
f410: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f430: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f440: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
f450: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
f460: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
f470: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
f480: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
f490: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
f4a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f4b0: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
f4c0: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
f4d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f4f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
f500: 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
f510: 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
f520: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f530: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
f540: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
f550: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f560: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
f570: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
f580: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
f590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
f5a0: 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
f5b0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ree = 0;.  }.  i
f5c0: 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
f5d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f5e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
f5f0: 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
f600: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f610: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
f620: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
f640: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
f650: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
f660: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
f670: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
f680: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
f690: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
f6a0: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
f6b0: 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
f6c0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
f6d0: 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
f6e0: 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
f6f0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
f700: 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
f710: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
f720: 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
f730: 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
f740: 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
f750: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f760: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
f770: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
f780: 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
f790: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
f7a0: 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
f7b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f7c0: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
f7d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
f7e0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
f7f0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f800: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
f810: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
f820: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
f830: 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
f840: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
f850: 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
f860: 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
f870: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
f880: 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
f890: 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
f8a0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f8b0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f8c0: 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
f8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f8e0: 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
f8f0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f900: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f910: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
f920: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
f930: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
f940: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
f950: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
f960: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
f970: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
f980: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
f990: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
f9a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
f9b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
f9c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f9d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f9e0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
f9f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
fa00: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
fa10: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
fa20: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
fa30: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
fa40: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
fa50: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
fa60: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
fa70: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
fa80: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
fa90: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
faa0: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
fab0: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
fac0: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
fad0: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
fae0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
faf0: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
fb00: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
fb10: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
fb20: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
fb30: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
fb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
fb50: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
fb60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
fb70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
fb80: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
fb90: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
fba0: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
fbb0: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
fbc0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
fbd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
fbe0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
fbf0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
fc00: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
fc10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
fc20: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
fc30: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
fc40: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
fc50: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
fc60: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
fc70: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
fc80: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
fc90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
fca0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fcb0: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
fcc0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
fcd0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
fce0: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
fcf0: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
fd00: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
fd10: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
fd20: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
fd30: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
fd40: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
fd50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
fd60: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
fd70: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
fd80: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
fd90: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
fda0: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
fdb0: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
fdc0: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
fdd0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
fde0: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
fdf0: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
fe00: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
fe10: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
fe20: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
fe30: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
fe40: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
fe50: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
fe60: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
fe70: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
fe80: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
fe90: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
fea0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
feb0: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
fec0: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
fed0: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
fee0: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
fef0: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
ff00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
ff10: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
ff20: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
ff30: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
ff40: 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
ff50: 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
ff60: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
ff70: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
ff80: 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
ff90: 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
ffa0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
ffb0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
ffc0: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
ffd0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
ffe0: 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
fff0: 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10000 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10010 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10020 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
10030 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10040 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10050 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
10060 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
10070 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
10080 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10090 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
100a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
100b0 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
100c0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
100d0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
100e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
100f0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
10100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10110 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
10120 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
10130 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
10140 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
10150 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
10160 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
10170 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
10180 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
10190 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
101a0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
101b0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
101c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
101d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
101e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
101f0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
10200 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10210 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
10220 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
10230 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
10240 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
10250 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
10260 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
10270 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
10280 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
10290 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
102a0 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
102b0 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
102c0 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
102d0 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
102e0 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
102f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
10300 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
10310 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
10320 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
10330 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
10340 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10350 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
10360 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
10370 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
10380 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
10390 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
103a0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
103b0 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
103c0 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
103d0 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
103e0 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
103f0 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
10400 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
10410 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
10420 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
10430 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
10440 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
10450 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
10460 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
10470 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
10480 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
10490 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
104a0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
104b0 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
104c0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
104d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
104e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
104f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10500 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
10510 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
10520 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10530 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
10540 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
10550 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
10560 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10570 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10590 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
105a0 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
105b0 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
105c0 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
105d0 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
105e0 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
105f0 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
10600 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
10610 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
10620 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
10630 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
10640 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
10650 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
10660 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
10670 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
10680 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
10690 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
106a0 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
106b0 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
106c0 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
106d0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
106e0 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
106f0 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
10700 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10710 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
10720 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
10730 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
10740 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
10750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10760 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
10770 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10780 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
10790 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
107a0 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
107b0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
107c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
107d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
107e0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
107f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
10800 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10810 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
10820 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
10830 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
10840 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
10850 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10860 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
10880 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
10890 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
108a0 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
108b0 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
108c0 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
108d0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
108e0 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
108f0 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
10900 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
10910 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
10920 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
10930 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
10940 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10950 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10960 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10970 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
10980 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
10990 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
109a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
109b0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
109c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
109d0 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
109e0 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
109f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10a00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10a10 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
10a30 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
10a40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10a50 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
10a60 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
10a70 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
10a80 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
10a90 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
10aa0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
10ab0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
10ac0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10ad0 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
10ae0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
10af0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
10b00 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
10b10 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
10b20 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
10b30 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
10b40 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
10b50 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
10b60 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
10b70 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
10b80 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
10b90 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
10ba0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
10bb0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
10bc0 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
10bd0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
10be0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
10bf0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
10c00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10c10 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
10c20 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
10c30 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
10c40 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
10c50 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
10c60 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
10c70 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
10c80 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
10c90 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
10ca0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
10cb0 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
10cc0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
10cd0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
10ce0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
10cf0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
10d00 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
10d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
10d20 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
10d30 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
10d40 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
10d50 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
10d60 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
10d70 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
10d80 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
10d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10da0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
10db0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
10dc0 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
10dd0 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
10de0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10df0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
10e00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10e10 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10e20 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
10e30 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
10e40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10e50 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
10e60 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
10e70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10e80 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
10e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
10ea0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
10eb0 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
10ec0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
10ed0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
10ee0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
10ef0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
10f00 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
10f10 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
10f20 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
10f30 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
10f40 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10f50 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
10f60 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
10f70 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
10f80 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
10f90 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
10fa0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
10fb0 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
10fc0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
10fd0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
10fe0 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
10ff0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11000 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
11010 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11020 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11030 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11040 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11050 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11060 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11070 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
11080 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
11090 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
110a0 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
110b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
110c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
110d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
110e0 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
110f0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
11100 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11110 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
11120 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
11130 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
11140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
11160 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
11170 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
11180 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
11190 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
111a0 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
111b0 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
111c0 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
111d0 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
111e0 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
111f0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11200 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
11210 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
11220 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
11230 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
11240 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
11250 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
11260 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
11270 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11280 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
11290 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
112a0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
112b0 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
112c0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
112d0 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
112e0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
112f0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
11300 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
11310 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
11320 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
11330 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
11340 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
11350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11360 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
11370 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
11380 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
11390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
113a0 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
113b0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
113c0 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
113d0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
113e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
113f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11400 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
11410 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11420 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
11430 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
11440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
11450 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
11460 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
11470 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
11480 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
11490 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
114a0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
114b0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
114c0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
114d0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
114e0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
114f0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
11500 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
11510 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
11520 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
11530 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
11540 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
11550 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
11560 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
11570 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
11580 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
11590 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
115a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
115b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
115c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
115d0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
115e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
115f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
11600 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11610 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
11620 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
11630 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11640 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11650 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
11660 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
11670 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
11690 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
116a0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
116b0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
116c0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
116d0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
116e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
116f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11700 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
11710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11720 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
11730 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
11740 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
11750 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
11760 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
11770 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11780 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
11790 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
117a0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
117b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
117c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
117d0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
117e0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
117f0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
11800 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11810 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
11820 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
11830 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
11840 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
11850 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
11860 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
11870 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
11880 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
11890 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
118a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
118b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
118c0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
118d0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
118e0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
118f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11900 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
11910 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
11920 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
11930 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
11940 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11950 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
11960 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
11970 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
11980 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
11990 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
119a0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
119b0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
119c0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
119d0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
119e0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
119f0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
11a00 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
11a10 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
11a20 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
11a30 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
11a40 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
11a50 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
11a60 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
11a70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
11a80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11a90 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
11ab0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
11ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11ad0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
11ae0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
11af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
11b10 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
11b20 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
11b30 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
11b40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
11b50 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
11b60 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
11b70 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
11b80 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
11b90 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
11ba0 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
11bb0 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ile. .  */.  rc 
11bc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
11bd0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
11be0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
11bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11c00 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61  K ){.    goto pa
11c10 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11c20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
11c30 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge>0 ){.    int 
11c40 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e  pageSize;.    in
11c50 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
11c60 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
11c70 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
11c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
11c90 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
11ca0 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
11cb0 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
11cc0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
11cd0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11ce0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11cf0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
11d00 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
11d10 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
11d20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
11d30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11d40 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11d50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11d60 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
11d70 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
11d80 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
11d90 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
11da0 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
11db0 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
11dc0 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
11dd0 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
11de0 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
11df0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
11e00 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
11e10 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
11e20 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
11e30 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
11e40 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
11e50 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
11e60 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
11e70 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
11e80 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
11e90 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
11ea0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11eb0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11ec0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
11ed0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
11ee0 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
11ef0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
11f00 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
11f10 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
11f20 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
11f30 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
11f40 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
11f50 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
11f60 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
11f70 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11f80 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11f90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
11fa0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11fb0 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
11fc0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
11fd0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
11fe0 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
11ff0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
12000 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
12010 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
12020 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
12030 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
12040 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
12050 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
12060 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
12070 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
12080 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
12090 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
120a0 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
120b0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
120c0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
120d0 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
120e0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
120f0 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
12100 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
12110 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
12120 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
12130 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
12140 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
12150 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
12160 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
12170 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12180 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53  e = (u16)usableS
12190 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
121a0 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
121b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
121c0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
121d0 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
121e0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
121f0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
12200 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
12210 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
12240 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
12250 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12260 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
12270 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
12280 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12290 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
122a0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
122b0 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
122c0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
122d0 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
122e0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
122f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12300 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
12310 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
12320 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
12330 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
12340 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
12350 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
12360 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
12370 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
12380 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
12390 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
123a0 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
123b0 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
123c0 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
123d0 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
123e0 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
123f0 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
12400 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
12410 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
12420 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
12430 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
12440 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
12450 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
12460 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
12470 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
12480 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
12490 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
124a0 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
124b0 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
124c0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
124d0 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
124e0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
124f0 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
12500 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
12510 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
12520 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
12530 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
12540 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
12550 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
12560 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
12570 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
12580 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
12590 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
125a0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
125b0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
125c0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
125d0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
125e0 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
125f0 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
12600 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
12610 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
12620 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
12630 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
12640 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
12650 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
12660 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
12670 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
12680 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
12690 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
126a0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
126b0 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
126c0 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
126d0 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
126e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
126f0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
12700 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
12710 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
12720 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
12730 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
12740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
12750 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
12760 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
12770 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
12780 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
12790 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
127a0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
127b0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
127c0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
127d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
127e0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
127f0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
12800 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
12810 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
12820 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
12830 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
12840 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
12850 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
12860 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
12870 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12880 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12890 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
128a0 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
128b0 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
128c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
128d0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
128e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
128f0 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20  ->pCursor==0 || 
12900 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12910 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
12920 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
12930 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
12940 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
12950 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61  age1!=0 ){.    a
12960 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
12970 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
12980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12990 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
129a0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
129b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
129c0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
129d0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
129e0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
129f0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
12a00 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
12a10 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
12a20 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
12a30 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
12a40 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
12a50 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
12a60 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
12a70 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
12a80 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
12a90 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
12aa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
12ab0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
12ac0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
12ad0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
12ae0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
12af0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
12b00 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
12b10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12b20 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
12b30 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 64 61 74   );.  /* The dat
12b40 61 62 61 73 65 20 73 69 7a 65 20 68 61 73 20 61  abase size has a
12b50 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 65 61 73  lready been meas
12b60 75 72 65 64 20 61 6e 64 20 63 61 63 68 65 64 2c  ured and cached,
12b70 20 73 6f 20 66 61 69 6c 75 72 65 0a 20 20 2a 2a   so failure.  **
12b80 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 68   is impossible h
12b90 65 72 65 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ere.  If the ori
12ba0 67 69 6e 61 6c 20 73 69 7a 65 20 6d 65 61 73 75  ginal size measu
12bb0 72 65 6d 65 6e 74 20 66 61 69 6c 65 64 2c 20 74  rement failed, t
12bc0 68 65 6e 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  hen.  ** process
12bd0 69 6e 67 20 61 62 6f 72 74 73 20 62 65 66 6f 72  ing aborts befor
12be0 65 20 65 6e 74 65 72 69 6e 67 20 74 68 69 73 20  e entering this 
12bf0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 63  routine. */.  rc
12c00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
12c10 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
12c20 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
12c30 20 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53   if( NEVER(rc!=S
12c40 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 6e 50 61  QLITE_OK) || nPa
12c50 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
12c60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
12c70 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
12c80 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
12c90 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
12ca0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
12cb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
12cc0 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
12cd0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
12ce0 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
12cf0 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
12d00 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
12d10 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
12d20 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
12d30 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
12d40 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
12d50 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65  a[16], pBt->page
12d60 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38  Size);.  data[18
12d70 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
12d80 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
12d90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
12da0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
12db0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
12dc0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
12dd0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12de0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
12df0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
12e00 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
12e10 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
12e20 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
12e30 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
12e40 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
12e50 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
12e60 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
12e70 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
12e80 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
12e90 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
12ea0 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
12eb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12ec0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
12ed0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
12ee0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
12ef0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
12f00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12f10 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
12f20 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
12f30 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
12f40 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
12f50 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
12f60 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
12f70 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
12f80 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
12f90 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
12fa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12fb0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
12fc0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
12fd0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
12fe0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
12ff0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
13000 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13010 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
13020 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
13030 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
13040 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
13050 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
13060 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
13070 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
13080 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
13090 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
130a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
130b0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
130c0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
130d0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
130e0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
130f0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
13100 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
13110 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
13120 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
13130 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
13140 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
13150 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
13160 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
13170 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
13180 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13190 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
131a0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
131b0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
131c0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
131d0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
131e0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
131f0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
13200 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
13210 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
13220 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
13230 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
13240 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
13250 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13260 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
13270 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13280 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
13290 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
132a0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
132b0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
132c0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
132d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
132e0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
132f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
13300 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
13310 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
13320 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
13330 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
13340 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
13350 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
13360 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
13370 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
13380 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
13390 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
133a0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
133b0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
133c0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
133d0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
133e0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
133f0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13400 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
13410 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
13420 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
13430 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
13440 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
13450 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
13460 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
13470 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
13480 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
13490 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
134a0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
134b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
134c0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
134d0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
134e0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
134f0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
13500 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
13510 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
13520 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
13530 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
13540 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
13550 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
13560 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
13570 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
13580 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
13590 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
135a0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
135b0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
135c0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
135d0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
135e0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
135f0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
13600 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
13610 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
13620 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
13630 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
13640 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
13650 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
13660 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
13670 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
13680 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
13690 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
136a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
136b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
136c0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
136d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
136e0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
136f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
13700 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
13710 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
13720 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
13730 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
13740 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
13750 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
13760 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
13770 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
13780 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
13790 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
137a0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
137b0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
137c0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
137d0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
137e0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
137f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
13800 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
13810 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
13820 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
13830 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
13840 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
13850 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
13860 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13870 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
13880 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
138a0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
138b0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
138c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
138d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
138e0 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
138f0 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
13900 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
13910 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
13920 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
13930 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
13940 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
13950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
13960 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
13970 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
13980 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
13990 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
139a0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
139b0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
139c0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
139d0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
139e0 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
139f0 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
13a00 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
13a10 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
13a20 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
13a30 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
13a40 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
13a50 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
13a60 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
13a70 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
13a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13a90 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
13aa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
13ab0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
13ac0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
13ad0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13ae0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
13af0 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
13b00 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
13b10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
13b20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
13b30 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
13b40 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
13b50 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
13b60 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
13b70 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
13b80 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
13b90 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
13ba0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
13bb0 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
13bc0 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
13bd0 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
13be0 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
13bf0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
13c00 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
13c10 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
13c20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
13c30 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
13c40 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  ;..  do {.    /*
13c50 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
13c60 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
13c70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
13c80 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
13c90 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
13ca0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
13cb0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
13cc0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
13cd0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
13ce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
13cf0 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
13d00 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
13d10 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
13d20 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
13d30 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
13d40 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
13d50 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
13d60 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
13d70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
13d80 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
13d90 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
13da0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
13db0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
13dc0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
13dd0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
13de0 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
13df0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
13e00 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
13e10 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
13e20 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
13e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13e40 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
13e50 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
13e60 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
13e70 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
13e80 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
13e90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13ea0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
13eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
13ec0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
13ed0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
13ee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13f00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
13f10 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
13f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13f30 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
13f40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13f50 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
13f60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
13f70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
13f80 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
13f90 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
13fa0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
13fb0 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
13fc0 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
13fd0 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
13fe0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
13ff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14000 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
14010 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
14020 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
14030 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
14040 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
14050 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
14060 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14070 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63  ..assert( p->loc
14080 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
14090 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
140a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
140b0 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
140c0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
140d0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
140e0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
140f0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
14100 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
14110 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
14120 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
14130 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
14140 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
14150 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
14160 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
14170 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
14180 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14190 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
141a0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
141b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
141c0 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20  D_CACHE.    if( 
141d0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
141e0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
141f0 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
14200 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
14210 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78  .      pBt->isEx
14220 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77  clusive = (u8)(w
14230 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a  rflag>1);.    }.
14240 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61  #endif.  }...tra
14250 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
14260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14270 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
14280 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
14290 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
142a0 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
142b0 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
142c0 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
142d0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
142e0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
142f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
14300 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
14310 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
14320 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
14330 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
14340 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
14350 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
14360 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
14370 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
14380 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
14390 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
143a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
143b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
143c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
143d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
143e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
143f0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
14400 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
14410 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
14420 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
14430 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
14440 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
14450 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
14460 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
14470 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
14480 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
14490 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
144a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
144b0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
144c0 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
144d0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
144e0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
144f0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
14520 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
14530 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
14540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14550 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
14560 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
14570 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
145a0 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
145b0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
145c0 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
145d0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
145e0 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
145f0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
14600 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
14610 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14620 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
14630 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
14640 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
14650 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
14670 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
14680 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
14690 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
146a0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
146b0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
146c0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
146d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
146e0 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
146f0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
14700 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
14710 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
14720 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
14730 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
14740 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
14750 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
14760 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
14770 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
14780 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
14790 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
147a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
147b0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
147c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
147d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
147e0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
147f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
14800 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
14810 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
14820 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
14830 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
14840 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
14850 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
14860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14870 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
14880 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
14890 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
148a0 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
148b0 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
148c0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
148d0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
148e0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
148f0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
14900 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
14910 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
14920 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
14930 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
14940 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
14950 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
14960 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
14970 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14980 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
14990 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
149a0 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
149b0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
149c0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
149d0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
149e0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
149f0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
14a00 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
14a10 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
14a20 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
14a30 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
14a40 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
14a50 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
14a60 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14a70 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
14a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
14aa0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
14ab0 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
14ac0 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
14ad0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
14ae0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
14af0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
14b00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14b10 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14b20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14b40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
14b50 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
14b60 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
14b70 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
14b80 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
14b90 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
14ba0 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
14bb0 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
14bc0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
14bd0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
14be0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
14bf0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
14c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14c10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14c20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
14c30 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
14c40 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
14c50 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14c60 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14c70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
14c80 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
14c90 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
14ca0 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
14cb0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14cc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14cd0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
14ce0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
14cf0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
14d00 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
14d10 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
14d20 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
14d30 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
14d40 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
14d50 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
14d60 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
14d70 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
14d80 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
14d90 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
14da0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
14db0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
14dc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14dd0 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
14de0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
14df0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
14e00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14e10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
14e20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14e30 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
14e40 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
14e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
14e60 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
14e70 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
14e80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14e90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
14ea0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
14eb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
14ec0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
14ed0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
14ee0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
14ef0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14f00 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
14f10 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
14f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14f30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14f40 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
14f50 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
14f60 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
14f70 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
14f80 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
14f90 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
14fa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14fb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
14fc0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
14fd0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
14fe0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
14ff0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
15000 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
15010 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
15020 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
15030 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
15040 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
15050 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
15060 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
15070 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
15080 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
15090 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
150a0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
150b0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
150c0 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
150d0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
150e0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
150f0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
15100 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
15110 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
15120 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
15130 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
15140 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
15150 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
15160 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
15170 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
15180 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
15190 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151b0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
151c0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
151d0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
151e0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
151f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
15200 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
15210 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
15220 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
15230 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
15240 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
15250 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
15260 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15280 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
15290 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
152a0 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
152b0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
152c0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
152d0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
152e0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
152f0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
15300 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
15310 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
15320 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
15330 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
15340 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
15350 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
15360 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
15370 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
15380 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
15390 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
153a0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
153b0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
153c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
153d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
153e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
153f0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
15400 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
15410 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
15420 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
15430 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
15440 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
15450 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
15460 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
15470 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
15480 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
15490 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
154a0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
154b0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
154c0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
154d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
154e0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
154f0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
15500 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
15510 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
15520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
15540 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
15550 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
15560 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
15570 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
15580 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
15590 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
155a0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
155b0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
155c0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
155d0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
155e0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
155f0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
15600 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
15610 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
15620 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
15630 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
15640 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
15650 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
15660 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
15670 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
15680 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
15690 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
156a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
156b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
156c0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
156d0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
156e0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
156f0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
15700 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
15710 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
15720 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
15730 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
15740 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
15750 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
15760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15780 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15790 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
157a0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
157b0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
157c0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
157d0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
157e0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
157f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
15800 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
15810 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
15820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
15840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15850 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
15860 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
15870 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
15880 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
15890 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
158a0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
158b0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
158c0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
158d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
158e0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
158f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
15900 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
15910 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
15920 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
15930 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
15940 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
15950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15960 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
15970 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15980 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15990 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
159a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
159b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
159c0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
159d0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
159e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
159f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
15a00 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
15a10 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
15a20 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
15a30 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
15a40 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
15a50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
15a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15a70 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
15a80 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
15a90 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
15aa0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
15ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15ac0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
15ad0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
15ae0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
15af0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
15b00 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
15b10 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
15b20 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
15b30 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
15b40 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
15b50 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
15b60 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
15b70 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
15b80 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51  ul,.** return SQ
15b90 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
15ba0 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
15bb0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
15bc0 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e  e no.** point in
15bd0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
15be0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
15bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15c00 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  E..**.** More sp
15c10 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66  ecificly, this f
15c20 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
15c30 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
15c40 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
15c50 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73   so that the las
15c60 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
15c70 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
15c80 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  use.** is no lon
15c90 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
15ca0 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61  * If the nFin pa
15cb0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
15cc0 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
15cd0 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
15ce0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
15cf0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
15d00 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
15d10 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
15d20 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
15d30 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
15d40 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
15d50 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
15d60 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
15d70 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
15d80 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
15d90 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
15da0 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46 69  omplete.  If nFi
15db0 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69 73  n is zero, it is
15dc0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
15dd0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
15de0 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
15df0 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74   a finite amount
15e00 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69   of times.** whi
15e10 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ch may or may no
15e20 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65 65  t empty the free
15e30 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61 75  list.  A full au
15e40 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20  tovacuum.** has 
15e50 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41 47  nFin>0.  A "PRAG
15e60 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76  MA incremental_v
15e70 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d  acuum" has nFin=
15e80 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  =0..*/.static in
15e90 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
15ea0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
15eb0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
15ec0 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f  iLastPg){.  Pgno
15ed0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
15ee0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15ef0 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
15f00 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
15f10 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
15f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15f30 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15f40 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
15f50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
15f60 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
15f70 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
15f80 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
15f90 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
15fa0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
15fb0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
15fc0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
15fd0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
15fe0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
15ff0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
16000 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
16010 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
16020 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16030 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
16040 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
16050 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
16060 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
16070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
160a0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
160b0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
160c0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
160d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
160e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
160f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16100 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
16110 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
16120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
16130 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
16140 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
16150 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
16160 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
16170 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
16180 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
16190 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
161a0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
161b0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
161c0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
161d0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
161e0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
161f0 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
16200 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
16210 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
16220 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
16230 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
16240 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
16250 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
16260 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
16270 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
16280 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
16290 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
162a0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
162b0 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
162c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
162d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
162e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
162f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
16300 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
16310 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
16320 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
16330 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
16340 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
16350 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
16360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16370 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
16380 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
16390 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
163a0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
163b0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
163c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
163d0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
163e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
163f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16410 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
16420 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
16430 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
16440 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
16450 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
16460 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
16470 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
16480 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
16490 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
164a0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
164b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
164c0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
164d0 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
164e0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
164f0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
16500 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
16510 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
16520 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
16530 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
16540 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
16550 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
16560 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
16570 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
16580 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
16590 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
165a0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
165b0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
165c0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
165d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
165e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
165f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
16600 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
16610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
16630 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
16640 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
16650 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
16660 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
16670 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
16680 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
16690 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
166a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
166b0 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
166c0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
166d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
166e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
166f0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
16700 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
16710 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
16720 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20  , nFin!=0);.    
16730 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
16740 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
16750 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16790 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29  .  if( nFin==0 )
167a0 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b  {.    iLastPg--;
167b0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73  .    while( iLas
167c0 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
167d0 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
167e0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
167f0 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20  iLastPg) ){.    
16800 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
16810 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
16820 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ) ){.        Mem
16830 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20  Page *pPg;.     
16840 20 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65     int rc = btre
16850 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
16860 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b  astPg, &pPg, 0);
16870 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
168a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
168b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
168c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
168d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
168e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
168f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Pg);.        if(
16900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16910 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
16920 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
16930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16940 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a  LastPg--;.    }.
16950 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
16960 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
16970 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74  t->pPager, iLast
16980 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
16990 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
169a0 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
169b0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
169c0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
169d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
169e0 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
169f0 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
16a00 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
16a10 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
16a20 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
16a30 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
16a40 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
16a50 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
16a60 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
16a70 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
16a80 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
16a90 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
16aa0 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
16ab0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
16ac0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16ad0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
16ae0 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
16af0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
16b00 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
16b10 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
16b20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
16b30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16b40 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
16b50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16b60 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
16b70 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
16b80 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
16b90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
16ba0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
16bb0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
16bc0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16bd0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
16be0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
16bf0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
16c00 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
16c10 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
16c20 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f  , 0, pagerPageco
16c30 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20  unt(pBt));.  }. 
16c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16c50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16c60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
16c70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16c80 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
16c90 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
16ca0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
16cb0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
16cc0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
16cd0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
16ce0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
16cf0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
16d00 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
16d10 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
16d20 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
16d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16d40 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
16d50 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
16d60 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
16d70 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
16d80 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
16d90 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
16da0 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
16db0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
16dc0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
16dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16de0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
16df0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16e00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16e10 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
16e20 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
16e30 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
16e40 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
16e50 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
16e60 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
16e70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16e80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
16e90 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
16ea0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
16eb0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
16ec0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
16ed0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
16ee0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
16ef0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
16f00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16f10 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
16f20 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
16f30 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
16f40 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
16f50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16f60 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
16f70 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
16f80 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ly */.    Pgno n
16f90 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
16fa0 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
16fb0 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
16fc0 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ed */.    Pgno i
16fd0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
16fe0 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
16ff0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
17000 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
17010 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17020 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
17030 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
17040 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
17050 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17060 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
17070 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
17080 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  rig = pagerPagec
17090 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
170a0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
170b0 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
170c0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
170d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
170e0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
170f0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
17100 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
17110 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
17120 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
17130 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
17140 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
17150 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
17160 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
17170 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
17180 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
17190 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
171a0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
171b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
171c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
171d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
171e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
171f0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
17200 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72  [36]);.    nEntr
17210 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
17220 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d  ize/5;.    nPtrm
17230 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
17240 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
17250 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
17260 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20  ry)/nEntry;.    
17270 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
17280 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
17290 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
172a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
172b0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
172c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
172d0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
172e0 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
172f0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
17300 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
17310 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
17320 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
17330 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
17340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
17350 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
17360 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17370 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28  _BKPT;..    for(
17380 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
17390 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
173a0 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
173b0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
173c0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
173d0 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b  t, nFin, iFree);
173e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
173f0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
17400 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
17410 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
17420 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17430 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  E_OK;.      rc =
17440 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17450 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
17460 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17470 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
17480 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
17490 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
174a0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
174b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
174c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
174d0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
174e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
174f0 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Fin);.    }.    
17500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17510 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
17520 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
17530 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
17540 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
17550 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
17560 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
17570 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
17580 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
17590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
175a0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
175b0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
175c0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
175d0 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
175e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
175f0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
17600 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
17610 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
17620 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
17630 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
17640 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
17650 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
17660 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
17670 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
17680 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
17690 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
176a0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
176b0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
176c0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
176d0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
176e0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
176f0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
17700 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
17710 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
17720 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
17730 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
17740 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
17750 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
17760 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
17770 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
17780 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
17790 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
177a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
177b0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
177c0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
177d0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
177e0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
177f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
17800 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
17810 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
17820 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
17830 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
17840 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
17850 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
17860 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
17870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17880 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
17890 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
178a0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
178b0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
178c0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
178d0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
178e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
178f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
17900 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
17910 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
17920 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
17930 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
17940 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
17950 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
17960 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
17970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
17980 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
17990 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
179a0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
179b0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
179c0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
179d0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
179e0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
179f0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
17a00 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
17a10 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
17a20 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
17a30 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
17a40 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
17a50 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
17a60 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
17a70 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
17a80 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
17a90 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
17aa0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
17ab0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
17ac0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
17ad0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
17ae0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
17af0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
17b00 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
17b10 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
17b20 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
17b30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
17b40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
17b50 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
17b60 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
17b70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17b80 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
17b90 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
17ba0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
17bb0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17bc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17bd0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
17be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17bf0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
17c00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
17c10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17c20 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
17c30 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
17c40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17c50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17c60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17c90 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
17ca0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
17cb0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
17cc0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
17cd0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
17ce0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17cf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17d00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17d10 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17d20 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
17d30 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
17d40 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
17d50 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
17d60 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
17d70 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
17d80 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
17d90 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
17da0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17db0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17dc0 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
17dd0 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20  pCsr;.  assert( 
17de0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
17df0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20  sMutex(p) );..  
17e00 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
17e10 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e  cursor held open
17e20 20 62 79 20 74 68 69 73 20 62 2d 74 72 65 65 20   by this b-tree 
17e30 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f  connection. If o
17e40 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20  ne exists,.  ** 
17e50 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  then the transac
17e60 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77  tion will be dow
17e70 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72 65 61  ngraded to a rea
17e80 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
17e90 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20  on.  ** instead 
17ea0 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63  of actually conc
17eb0 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65 71 75  luded. A subsequ
17ec0 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d  ent call to Comm
17ed0 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20  itPhaseTwo() .  
17ee0 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29  ** or Rollback()
17ef0 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65   will finish the
17f00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
17f10 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
17f20 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  base.  */.  for(
17f30 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCsr=pBt->pCurso
17f40 72 3b 20 70 43 73 72 20 26 26 20 70 43 73 72 2d  r; pCsr && pCsr-
17f50 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72  >pBtree!=p; pCsr
17f60 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20  =pCsr->pNext);. 
17f70 20 61 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30   assert( pCsr==0
17f80 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54   || p->inTrans>T
17f90 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  RANS_NONE );..  
17fa0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
17fb0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28  tent(pBt);.  if(
17fc0 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77   pCsr ){.    dow
17fd0 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
17fe0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
17ff0 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
18000 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
18010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
18020 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
18030 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
18040 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
18050 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
18060 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
18070 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
18080 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
18090 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
180a0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
180b0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
180c0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
180d0 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
180e0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
180f0 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
18100 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
18110 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
18120 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
18130 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
18140 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
18150 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
18160 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
18170 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
18180 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
18190 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
181a0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
181b0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
181c0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
181d0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
181e0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
181f0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
18200 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
18210 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
18220 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
18230 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
18240 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
18250 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
18260 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
18270 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
18280 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
18290 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
182a0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
182b0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
182c0 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
182d0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
182e0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
182f0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
18300 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18310 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
18320 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
18330 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
18340 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
18350 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
18360 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
18370 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
18380 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
18390 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
183a0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
183b0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
183c0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
183d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
183e0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
183f0 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
18400 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
18410 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
18420 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
18430 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
18440 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
18450 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
18460 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
18470 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
18480 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
18490 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
184a0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
184b0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
184c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
184d0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
184e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
184f0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
18500 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
18510 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
18520 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
18530 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18540 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
18550 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
18560 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
18570 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
18580 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
18590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
185a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
185b0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
185c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
185d0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
185e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
185f0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
18600 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
18610 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
18620 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
18630 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
18640 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
18650 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
18660 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
18670 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
18680 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
18690 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
186a0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
186b0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
186c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
186d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
186e0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
186f0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
18700 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
18710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18720 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
18730 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
18740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
18760 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18770 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
18780 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
18790 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
187a0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
187b0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
187c0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
187d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
187e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
187f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18800 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
18810 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
18820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18830 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
18840 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
18850 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18860 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
18870 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
18880 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
18890 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
188a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
188b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
188c0 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20  itPhaseTwo(p);. 
188d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
188e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
188f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
18900 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
18910 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18920 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
18930 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
18940 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
18950 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
18960 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
18970 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
18980 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
18990 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
189a0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  efined..**.** Fo
189b0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
189c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
189d0 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
189e0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
189f0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
18a00 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  of writing to th
18a10 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74  e databse.  That
18a20 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f   means the curso
18a30 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61  r was.** origina
18a40 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  lly opened for w
18a50 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63  riting and the c
18a60 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65  ursor has not be
18a70 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20   disabled.** by 
18a80 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65  having its state
18a90 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53   changed to CURS
18aa0 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61  OR_FAULT..*/.sta
18ab0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
18ac0 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
18ad0 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
18ae0 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
18af0 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
18b00 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
18b10 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
18b20 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
18b30 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
18b40 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
18b50 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
18b60 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
18b70 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
18b80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18b90 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
18ba0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
18bb0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
18bc0 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
18bd0 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
18be0 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
18bf0 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
18c00 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
18c10 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
18c20 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
18c30 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
18c40 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
18c50 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
18c60 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
18c70 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
18c80 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
18c90 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
18ca0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18cb0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
18cc0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
18cd0 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
18ce0 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
18cf0 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
18d00 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
18d10 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
18d20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
18d30 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
18d40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
18d50 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
18d60 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
18d70 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
18d80 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
18d90 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
18da0 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
18db0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
18dc0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
18dd0 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
18de0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
18df0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
18e00 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
18e10 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
18e20 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
18e30 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71  tCursor *p;.  sq
18e40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18e50 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
18e60 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
18e70 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
18e80 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
18e90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
18ea0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
18eb0 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
18ec0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
18ed0 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
18ee0 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
18ef0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
18f00 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
18f10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
18f20 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
18f30 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
18f40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
18f50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18f60 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
18f70 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
18f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
18f90 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
18fa0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
18fb0 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
18fc0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
18fd0 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
18fe0 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
18ff0 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
19000 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
19010 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
19020 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
19030 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
19040 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
19050 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
19060 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19070 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
19080 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
19090 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
190a0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
190b0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
190c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
190d0 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
190e0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
190f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19100 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
19110 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
19120 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
19130 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  p);.  rc = saveA
19140 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
19150 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
19160 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
19170 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
19180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19190 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
191a0 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
191b0 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
191c0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
191d0 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
191e0 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
191f0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
19200 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
19210 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
19220 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
19230 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
19240 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
19250 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
19260 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
19270 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
19280 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
19290 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
192a0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
192b0 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
192c0 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
192d0 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
192e0 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
192f0 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
19300 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
19310 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
19320 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
19330 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
19340 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
19350 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
19360 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
19370 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20  ursors(p, rc);. 
19380 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
19390 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
193a0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
193b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
193c0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
193d0 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
193e0 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
193f0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
19400 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
19410 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
19420 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
19430 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
19440 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19450 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
19460 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
19470 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
19480 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
19490 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
194a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
194b0 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
194c0 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
194d0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
194e0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
194f0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
19500 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
19510 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
19520 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
19530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19540 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
19550 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
19560 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
19570 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
19580 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
19590 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
195a0 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
195b0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
195c0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
195d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
195e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
195f0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
19600 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
19610 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
19620 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61  ansaction can ca
19630 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
19640 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
19650 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
19660 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
19670 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
19680 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
19690 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
196a0 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
196b0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
196c0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
196d0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
196e0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
196f0 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
19700 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
19710 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
19720 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
19730 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
19740 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
19750 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
19760 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
19770 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
19780 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
19790 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
197a0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
197b0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
197c0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
197d0 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
197e0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
197f0 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
19800 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
19810 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
19820 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
19830 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
19840 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
19850 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
19860 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
19870 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
19880 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
19890 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
198a0 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
198b0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
198c0 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
198d0 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
198e0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
198f0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
19900 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
19910 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
19920 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
19930 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
19940 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
19950 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
19960 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
19970 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
19980 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
19990 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
199a0 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
199b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
199c0 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
199d0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
199e0 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
199f0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
19a00 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
19a10 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
19a20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19a30 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19a40 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
19a50 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19a60 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
19a70 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f  sert( pBt->readO
19a80 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
19a90 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
19aa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
19ab0 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
19ac0 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
19ad0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54  if( NEVER(p->inT
19ae0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54  rans!=TRANS_WRIT
19af0 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e  E || pBt->readOn
19b00 6c 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ly) ){.    rc = 
19b10 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
19b20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
19b30 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
19b40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
19b50 57 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20  WRITE );.    /* 
19b60 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
19b70 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
19b80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
19b90 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
19ba0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20      ** an index 
19bb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
19bc0 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
19bd0 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
19be0 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20  sing.    ** SQL 
19bf0 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
19c00 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
19c10 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
19c20 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a  llback any.    *
19c30 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
19c40 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
19c50 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
19c60 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
19c70 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ctive..    */.  
19c80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19c90 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
19ca0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
19cb0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  tatement);.  }. 
19cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19cd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19ce0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
19cf0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19d00 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
19d10 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
19d20 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
19d30 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
19d40 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
19d50 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
19d60 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
19d70 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
19d80 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
19d90 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
19da0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
19db0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
19dc0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
19dd0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
19de0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
19df0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
19e00 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
19e10 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
19e20 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
19e30 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
19e40 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
19e50 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
19e60 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
19e70 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
19e80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
19e90 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
19ea0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
19eb0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
19ec0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
19ed0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
19ee0 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
19ef0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
19f00 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
19f10 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
19f20 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
19f30 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
19f40 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
19f50 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
19f60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
19f70 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
19f80 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
19f90 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
19fa0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19fb0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
19fc0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
19fd0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
19fe0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
19ff0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1a000 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1a010 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1a020 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1a030 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1a040 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a050 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a060 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1a070 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1a080 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1a090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a0a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1a0b0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1a0c0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  Bt);.    }.    s
1a0d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a0e0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1a0f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1a100 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1a110 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1a120 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1a130 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1a140 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1a150 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1a160 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1a170 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1a180 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1a190 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1a1a0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1a1b0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1a1c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a1d0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1a1e0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1a1f0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1a200 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1a210 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1a220 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1a230 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1a240 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1a250 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1a260 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1a270 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1a280 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1a290 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1a2a0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1a2b0 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1a2c0 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1a2d0 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1a2e0 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1a2f0 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1a300 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1a310 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1a320 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1a330 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1a340 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1a350 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1a360 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1a370 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1a380 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1a390 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1a3a0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1a3b0 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1a3c0 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1a3d0 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1a3e0 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1a3f0 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1a400 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1a410 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1a420 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1a430 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1a440 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1a450 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1a460 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1a470 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1a480 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1a490 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1a4a0 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1a4b0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1a4c0 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1a4d0 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1a4e0 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1a4f0 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1a500 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1a510 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1a520 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1a530 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1a540 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1a550 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1a560 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1a570 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1a580 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1a590 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1a5a0 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1a5b0 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1a5c0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1a5d0 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1a5e0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1a5f0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1a600 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1a610 28 29 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  () bytes of memo
1a620 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  ry .** pointed t
1a630 6f 20 62 79 20 70 43 75 72 20 68 61 76 65 20 62  o by pCur have b
1a640 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68  een zeroed by th
1a650 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1a660 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
1a670 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a6a0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1a6b0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
1a6e0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
1a6f0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
1a700 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a720 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1a730 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1a740 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1a750 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1a760 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1a770 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
1a780 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
1a790 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7b0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1a7c0 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
1a7d0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
1a7e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a800 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
1a810 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  handle */..  ass
1a820 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1a830 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1a840 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1a850 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1a860 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
1a870 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1a880 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
1a890 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
1a8a0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
1a8b0 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
1a8c0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
1a8d0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
1a8e0 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1a8f0 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
1a900 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
1a910 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
1a920 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
1a930 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
1a940 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
1a950 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
1a960 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
1a970 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
1a980 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
1a990 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a  0, wrFlag+1) );.
1a9a0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1a9b0 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
1a9c0 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
1a9d0 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
1a9e0 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
1a9f0 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
1aa00 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
1aa10 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
1aa20 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1aa30 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1aa40 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1aa50 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
1aa60 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1aa70 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1aa80 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
1aa90 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1aaa0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46  .  if( NEVER(wrF
1aab0 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64  lag && pBt->read
1aac0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74  Only) ){.    ret
1aad0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
1aae0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  NLY;.  }.  if( i
1aaf0 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65  Table==1 && page
1ab00 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  rPagecount(pBt)=
1ab10 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1ab20 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
1ab30 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
1ab40 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
1ab50 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
1ab60 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
1ab70 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
1ab80 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
1ab90 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
1aba0 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
1abb0 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
1abc0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
1abd0 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
1abe0 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
1abf0 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
1ac00 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
1ac10 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
1ac20 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
1ac30 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c  Bt;.  pCur->wrFl
1ac40 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b  ag = (u8)wrFlag;
1ac50 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1ac60 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
1ac70 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1ac80 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
1ac90 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1aca0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
1acb0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
1acc0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1acd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1ace0 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1acf0 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  id = 0;.  return
1ad00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
1ad10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1ad20 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1ad30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
1ad60 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1ad70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
1ada0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
1adb0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
1adf0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
1ae00 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
1ae10 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae30 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
1ae40 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
1ae50 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1ae80 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
1ae90 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1aea0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1aeb0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1aec0 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
1aed0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
1aee0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
1aef0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1af00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1af10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1af20 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1af30 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
1af40 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
1af50 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
1af60 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
1af70 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
1af80 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
1af90 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
1afa0 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
1afb0 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
1afc0 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
1afd0 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
1afe0 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
1aff0 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
1b000 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
1b010 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
1b020 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
1b030 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
1b040 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
1b050 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
1b060 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
1b070 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  sor);.}../*.** S
1b080 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  et the cached ro
1b090 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65  wid value of eve
1b0a0 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65  ry cursor in the
1b0b0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1b0c0 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61  ile.** as pCur a
1b0d0 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61  nd having the sa
1b0e0 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  me root page num
1b0f0 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68  ber as pCur.  Th
1b100 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  e value is.** se
1b110 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a  t to iRowid..**.
1b120 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65  ** Only positive
1b130 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72   rowid values ar
1b140 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c  e considered val
1b150 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68  id for this cach
1b160 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20  e..** The cache 
1b170 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1b180 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69  o zero, indicati
1b190 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61  ng an invalid ca
1b1a0 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20  che..** A btree 
1b1b0 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77  will work fine w
1b1c0 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  ith zero or nega
1b1d0 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65  tive rowids.  We
1b1e0 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20   just cannot.** 
1b1f0 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65  cache zero or ne
1b200 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77  gative rowids, w
1b210 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65  hich means table
1b220 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20  s that use zero 
1b230 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72  or.** negative r
1b240 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20  owids might run 
1b250 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
1b260 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63    But in practic
1b270 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65  e, zero.** or ne
1b280 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72  gative rowids ar
1b290 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20  e very uncommon 
1b2a0 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  so this should n
1b2b0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
1b2c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b2d0 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
1b2e0 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
1b2f0 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ur, sqlite3_int6
1b300 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43  4 iRowid){.  BtC
1b310 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
1b320 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75  p=pCur->pBt->pCu
1b330 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1b340 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1b350 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d  >pgnoRoot==pCur-
1b360 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63  >pgnoRoot ) p->c
1b370 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f  achedRowid = iRo
1b380 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  wid;.  }.  asser
1b390 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  t( pCur->cachedR
1b3a0 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a  owid==iRowid );.
1b3b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b3c0 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1b3d0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
1b3e0 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69  ursor.  A negati
1b3f0 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65  ve or zero.** re
1b400 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1b410 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f  ates that the ro
1b420 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76  wid cache is inv
1b430 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
1b440 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  be.** ignored.  
1b450 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  If the rowid cac
1b460 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  he has never bef
1b470 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68  ore been set, th
1b480 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20  en a.** zero is 
1b490 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  returned..*/.sql
1b4a0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1b4b0 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
1b4c0 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1b4d0 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1b4e0 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1b4f0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
1b500 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1b510 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1b520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b530 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1b540 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1b550 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1b560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b570 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1b580 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1b590 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1b5a0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1b5b0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1b5c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1b5d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1b5e0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1b5f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b600 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1b610 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1b620 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1b630 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1b640 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1b650 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1b660 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1b670 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1b680 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1b690 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1b6a0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1b6b0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1b6c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1b6d0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1b6e0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1b6f0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1b700 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1b710 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1b720 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1b730 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1b740 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1b750 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
1b760 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
1b770 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
1b780 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
1b790 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b7a0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1b7b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b7c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1b7d0 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1b7e0 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1b7f0 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1b800 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1b810 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1b820 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1b830 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1b840 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
1b850 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
1b860 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
1b870 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
1b880 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
1b890 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1b8a0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
1b8b0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
1b8c0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
1b8d0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
1b8e0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
1b8f0 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1b900 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1b910 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1b920 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1b930 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1b940 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1b950 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1b960 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1b970 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1b980 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1b990 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1b9a0 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1b9b0 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1b9c0 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1b9d0 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1b9e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1b9f0 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1ba00 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1ba10 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1ba20 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1ba30 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1ba40 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1ba50 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1ba60 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1ba70 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1ba80 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1ba90 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1baa0 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1bab0 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1bac0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1bad0 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1bae0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1baf0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1bb00 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1bb10 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1bb20 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1bb30 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1bb40 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1bb50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1bb60 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1bb70 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
1bb80 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
1bb90 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
1bba0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
1bbb0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
1bbc0 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
1bbd0 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
1bbe0 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
1bbf0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
1bc00 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
1bc10 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
1bc20 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
1bc30 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
1bc40 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1bc50 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
1bc60 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1bc70 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
1bc80 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1bc90 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74  >iPage;.      bt
1bca0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1bcb0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1bcc0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1bcd0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1bce0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1bcf0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1bd00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1bd10 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1bd20 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1bd30 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1bd40 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1bd50 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1bd60 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1bd70 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1bd80 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1bd90 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1bda0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1bdf0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1be00 29 7b 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1be40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1be50 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65        \.    btre
1be90 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1bea0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1beb0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1bec0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1bed0 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1bee0 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
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 20 20 20                  
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
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 20 20                  
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1bf80 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
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 20                  
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1bfd0 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1bfe0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1bff0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1c000 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1c010 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1c020 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1c030 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1c040 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1c050 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1c060 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1c070 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1c080 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1c090 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1c0a0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1c0b0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1c0c0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1c0d0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1c0e0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1c0f0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1c100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1c110 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1c120 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1c130 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1c140 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
1c150 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
1c160 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
1c170 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1c180 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1c190 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1c1a0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1c1b0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1c1c0 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1c1d0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1c1e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1c1f0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1c200 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1c210 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1c220 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1c230 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1c240 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1c250 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1c260 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1c270 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1c280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1c290 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1c2a0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1c2b0 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
1c2c0 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
1c2d0 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1c2e0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
1c2f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1c300 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
1c310 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1c320 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
1c330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1c340 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1c350 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1c360 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1c370 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1c380 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1c390 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c3a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1c3b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1c3c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1c3d0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1c3e0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
1c3f0 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
1c400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
1c410 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1c420 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
1c430 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1c440 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c460 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1c470 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1c480 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
1c490 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
1c4a0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
1c4b0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
1c4c0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1c4d0 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1c4e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
1c4f0 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
1c500 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
1c510 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
1c520 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
1c530 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
1c540 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
1c550 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
1c560 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
1c570 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
1c580 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
1c590 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
1c5a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
1c5b0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1c5c0 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
1c5d0 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
1c5e0 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
1c5f0 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
1c600 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
1c610 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
1c620 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
1c630 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
1c640 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
1c650 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1c660 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
1c670 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
1c680 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1c690 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1c6a0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1c6b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1c6c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1c6d0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1c6e0 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
1c6f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
1c700 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  a;.  return SQLI
1c710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1c720 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
1c730 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
1c740 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1c750 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
1c760 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
1c770 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
1c780 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
1c790 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
1c7a0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
1c7b0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
1c7c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
1c7d0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
1c7e0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
1c7f0 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
1c800 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
1c810 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
1c820 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
1c830 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
1c840 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c850 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
1c860 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1c870 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1c880 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
1c890 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1c8a0 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
1c8b0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
1c8c0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
1c8d0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
1c8e0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
1c8f0 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
1c900 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
1c910 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
1c920 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
1c930 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
1c940 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
1c950 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
1c960 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
1c970 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
1c980 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
1c990 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
1c9a0 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
1c9b0 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
1c9c0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1c9d0 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
1c9e0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1c9f0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1ca00 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
1ca10 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
1ca20 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
1ca30 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
1ca40 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
1ca50 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
1ca60 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1ca70 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
1ca80 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
1ca90 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
1caa0 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
1cab0 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
1cac0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
1cad0 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
1cae0 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
1caf0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1cb00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1cb10 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1cb20 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
1cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cb40 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
1cb50 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1cb60 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
1cb70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1cb80 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
1cb90 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
1cba0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
1cbb0 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
1cbc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1cbd0 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
1cbe0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
1cbf0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
1cc00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cc10 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
1cc20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1cc30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cc40 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1cc50 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1cc60 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1cc70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1cc80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1cc90 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1cca0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1ccb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1ccc0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1ccd0 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1cce0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1ccf0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1cd00 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1cd10 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1cd20 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1cd30 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1cd40 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1cd50 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1cd60 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1cd70 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1cd80 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1cd90 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1cda0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1cdb0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1cdc0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1cdd0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1cde0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1cdf0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1ce00 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1ce10 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1ce20 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1ce30 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1ce40 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1ce50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1ce60 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1ce70 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1ce80 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72  f( iGuess<=pager
1ce90 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1cea0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1ceb0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1cec0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1ced0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1cee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1cef0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1cf00 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1cf10 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1cf20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1cf30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cf40 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1cf50 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1cf60 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
1cf70 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
1cf80 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
1cf90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cfa0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1cfb0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1cfc0 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
1cfd0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1cfe0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1cff0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
1d000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d010 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
1d020 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1d030 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1d040 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
1d050 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
1d060 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
1d070 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
1d080 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
1d090 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
1d0a0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1d0b0 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
1d0c0 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
1d0d0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
1d0e0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
1d0f0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
1d100 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
1d110 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
1d120 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
1d130 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
1d140 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
1d150 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
1d160 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
1d170 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
1d180 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
1d190 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
1d1a0 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
1d1b0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
1d1c0 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
1d1d0 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
1d1e0 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
1d1f0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1d200 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
1d210 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
1d220 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
1d230 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
1d240 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
1d250 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
1d260 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1d270 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
1d280 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
1d290 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1d2a0 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
1d2b0 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
1d2c0 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
1d2d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
1d2e0 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
1d2f0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1d300 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d310 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
1d320 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
1d330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d340 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d350 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
1d360 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1d370 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
1d380 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
1d390 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
1d3a0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
1d3b0 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
1d3c0 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
1d3d0 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
1d3e0 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
1d3f0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1d400 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
1d410 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
1d420 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
1d430 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d440 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
1d450 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d480 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
1d490 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
1d4a0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1d4b0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1d4c0 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
1d4d0 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
1d4e0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
1d4f0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
1d500 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
1d510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d520 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
1d530 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1d540 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
1d550 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
1d560 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
1d570 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1d580 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
1d590 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
1d5a0 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70   If the eOp.** p
1d5b0 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
1d5c0 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
1d5d0 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f  eration (data co
1d5e0 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66  pied into.** buf
1d5f0 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74  fer pBuf). If it
1d600 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20   is non-zero, a 
1d610 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69  write (data copi
1d620 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65  ed from.** buffe
1d630 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41  r pBuf)..**.** A
1d640 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
1d650 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f  bytes are read o
1d660 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e  r written beginn
1d670 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ing at "offset".
1d680 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64  .** Data is read
1d690 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
1d6a0 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
1d6b0 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62  ** The content b
1d6c0 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69  eing read or wri
1d6d0 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61  tten might appea
1d6e0 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
1d6f0 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74  ge.** or be scat
1d700 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
1d710 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70  tiple overflow p
1d720 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ages..**.** If t
1d730 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e  he BtCursor.isIn
1d740 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1d750 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68  g is set, and th
1d760 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72  e current.** cur
1d770 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
1d780 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
1d790 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20  low pages, this 
1d7a0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
1d7b0 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20  cates space for 
1d7c0 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75  and lazily poplu
1d7d0 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
1d7e0 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20  w page-list .** 
1d7f0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
1d800 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
1d810 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  . Subsequent cal
1d820 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63  ls use this.** c
1d830 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
1d840 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
1d850 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65  lied offset more
1d860 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
1d870 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
1d880 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1d890 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
1d8a0 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
1d8b0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
1d8c0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
1d8d0 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
1d8e0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
1d8f0 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
1d900 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
1d910 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
1d920 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
1d930 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1d940 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
1d950 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
1d960 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
1d970 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1d980 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
1d990 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
1d9a0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
1d9b0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
1d9c0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
1d9d0 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
1d9e0 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
1d9f0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
1da00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1da10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1da20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
1da30 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1da40 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
1da50 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
1da60 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
1da70 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
1da80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
1da90 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
1daa0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
1dab0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
1dac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1dad0 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
1dae0 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
1daf0 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
1db00 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
1db10 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
1db20 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
1db30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1db40 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
1db50 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
1db60 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1db70 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1db80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1db90 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
1dba0 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
1dbb0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1dbc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1dbd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1dbe0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
1dbf0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
1dc00 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1dc10 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc30 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
1dc40 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1dc50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1dc60 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1dc70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1dc80 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1dc90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1dca0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1dcb0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1dcc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1dcd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1dce0 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
1dcf0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
1dd00 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
1dd10 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
1dd20 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1dd30 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
1dd40 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28  ->intKey ? 0 : (
1dd50 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1dd60 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  Key);..  if( NEV
1dd70 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20  ER(offset+amt > 
1dd80 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
1dd90 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61  nData) .   || &a
1dda0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1ddb0 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50  fo.nLocal] > &pP
1ddc0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
1ddd0 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b  usableSize].  ){
1dde0 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
1ddf0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1de00 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
1de10 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
1de20 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
1de30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1de40 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
1de50 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
1de60 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
1de70 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
1de80 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
1de90 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
1dea0 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
1deb0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
1dec0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
1ded0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
1dee0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1def0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
1df00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
1df10 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
1df20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
1df30 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
1df40 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
1df50 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
1df60 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
1df70 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
1df80 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
1df90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
1dfa0 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
1dfb0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
1dfc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dfd0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
1dfe0 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
1dff0 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
1e000 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
1e010 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
1e020 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
1e030 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
1e040 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
1e050 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
1e060 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1e070 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
1e080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e090 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
1e0a0 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
1e0b0 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
1e0c0 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
1e0d0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
1e0e0 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
1e0f0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1e100 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
1e110 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
1e120 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
1e130 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
1e140 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1e150 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1e160 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
1e170 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e180 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
1e190 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
1e1a0 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
1e1b0 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
1e1c0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
1e1d0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
1e1e0 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
1e1f0 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
1e200 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
1e210 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
1e220 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1e230 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
1e240 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
1e250 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1e260 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
1e270 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
1e280 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
1e290 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
1e2a0 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
1e2b0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
1e2c0 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
1e2d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1e2e0 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
1e2f0 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e  vfl);.      /* n
1e300 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70  Ovfl is always p
1e310 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20  ositive.  If it 
1e320 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68  were zero, fetch
1e330 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61  Payload would ha
1e340 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e  ve.      ** been
1e350 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
1e360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a   this routine. *
1e370 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
1e380 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43  YS(nOvfl) && !pC
1e390 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1e3a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e3b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e3c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e3d0 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
1e3e0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1e3f0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1e400 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
1e410 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
1e420 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
1e430 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1e440 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
1e450 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
1e460 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
1e470 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1e480 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1e490 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
1e4a0 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
1e4b0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
1e4c0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
1e4d0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1e4e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e4f0 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
1e500 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
1e510 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
1e520 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
1e530 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1e540 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
1e550 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
1e560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e570 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
1e580 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
1e590 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
1e5a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1e5b0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
1e5c0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1e5d0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
1e5e0 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
1e5f0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
1e600 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1e610 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
1e620 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
1e630 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
1e640 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
1e650 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1e660 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
1e670 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
1e680 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
1e690 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
1e6a0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
1e6b0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
1e6c0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
1e6d0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
1e6e0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1e6f0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
1e700 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
1e710 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
1e720 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
1e730 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
1e740 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
1e750 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
1e760 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
1e770 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
1e780 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
1e790 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
1e7a0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
1e7b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e7c0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1e7d0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1e7e0 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1e7f0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1e800 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
1e810 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
1e820 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1e830 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20  x+1];.        } 
1e840 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
1e850 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
1e860 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
1e870 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
1e880 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1e890 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
1e8a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
1e8b0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
1e8c0 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
1e8d0 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
1e8e0 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
1e8f0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1e900 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
1e910 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
1e920 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
1e930 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
1e940 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e950 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
1e960 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
1e970 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
1e980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e990 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
1e9a0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
1e9b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e9c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e9d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e9e0 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
1e9f0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
1ea00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1ea10 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
1ea20 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
1ea30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ea40 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
1ea50 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
1ea60 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
1ea70 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1ea80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ea90 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1eaa0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1eab0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
1eac0 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
1ead0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1eae0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
1eaf0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1eb00 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
1eb10 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
1eb20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b            pBuf +
1eb30 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = a;.        }. 
1eb40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1eb50 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1eb60 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1eb70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1eb80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1eb90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1eba0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
1ebb0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
1ebc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ebd0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1ebe0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1ebf0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1ec00 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1ec10 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1ec20 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1ec30 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1ec40 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1ec50 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
1ec60 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1ec70 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
1ec80 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
1ec90 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1eca0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1ecb0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1ecc0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1ecd0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1ece0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1ecf0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1ed00 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1ed10 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1ed20 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1ed30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1ed40 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
1ed50 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1ed60 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1ed70 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
1ed80 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ed90 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1eda0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1edb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1edc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1edd0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1ede0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1edf0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
1ee00 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1ee10 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1ee20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1ee30 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1ee40 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
1ee50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
1ee60 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
1ee70 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
1ee80 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
1ee90 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
1eea0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1eeb0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1eec0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1eed0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1eee0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1eef0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1ef00 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1ef10 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1ef20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1ef30 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1ef40 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1ef50 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1ef60 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1ef70 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1ef80 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1ef90 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1efa0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1efb0 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1efc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
1efd0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
1efe0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1eff0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1f000 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
1f010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f020 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
1f030 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
1f040 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1f050 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1f060 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
1f070 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1f080 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f090 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1f0a0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1f0b0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1f0c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f0d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1f0e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f0f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1f110 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1f120 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f130 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
1f140 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1f150 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f160 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1f170 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1f180 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
1f190 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1f1a0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
1f1b0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1f1c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f1d0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1f1e0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
1f1f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1f200 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1f210 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
1f220 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1f230 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
1f240 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
1f250 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
1f260 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
1f270 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
1f280 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1f290 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
1f2a0 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
1f2b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1f2c0 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
1f2d0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
1f2e0 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
1f2f0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
1f300 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1f310 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
1f320 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
1f330 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1f340 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
1f350 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
1f360 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
1f370 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
1f380 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
1f390 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
1f3a0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
1f3b0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
1f3c0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
1f3d0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
1f3e0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1f3f0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
1f400 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
1f410 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
1f420 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
1f430 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
1f440 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
1f450 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1f460 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
1f470 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
1f480 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
1f490 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
1f4a0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
1f4b0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
1f4c0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
1f4d0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
1f4e0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
1f4f0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
1f500 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
1f510 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
1f520 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
1f530 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
1f540 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
1f550 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
1f560 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
1f570 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
1f580 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1f590 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
1f5a0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1f5b0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1f5c0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1f5d0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1f5e0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
1f5f0 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
1f600 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
1f610 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1f620 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
1f630 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
1f640 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
1f650 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
1f660 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
1f670 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1f680 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1f690 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1f6a0 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
1f6b0 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    u32 nLocal;.. 
1f6c0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
1f6d0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
1f6e0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1f6f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1f700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f710 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f720 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1f730 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f740 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f750 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1f760 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f770 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
1f780 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1f790 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
1f7a0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ll );.  if( NEVE
1f7b0 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  R(pCur->info.nSi
1f7c0 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74  ze==0) ){.    bt
1f7d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1f7e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f7f0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1f800 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f820 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f       &pCur->info
1f830 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61  );.  }.  aPayloa
1f840 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1f850 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
1f860 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
1f870 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
1f880 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1f890 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
1f8a0 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
1f8b0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1f8c0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
1f8d0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
1f8e0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
1f8f0 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
1f900 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f910 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
1f920 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
1f930 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f940 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c  ;.    assert( nL
1f950 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20  ocal<=nKey );.  
1f960 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
1f970 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
1f980 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
1f990 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
1f9a0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
1f9b0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
1f9c0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
1f9d0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
1f9e0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
1f9f0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
1fa00 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
1fa10 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
1fa20 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1fa30 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
1fa40 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
1fa50 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
1fa60 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
1fa70 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
1fa80 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
1fa90 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
1faa0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
1fab0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
1fac0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
1fad0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
1fae0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
1faf0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
1fb00 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
1fb10 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
1fb20 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
1fb30 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1fb40 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1fb50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
1fb60 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
1fb70 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
1fb80 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
1fb90 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
1fba0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
1fbb0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1fbc0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
1fbd0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
1fbe0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
1fbf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1fc00 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
1fc10 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
1fc20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fc30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1fc40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1fc50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1fc60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1fc70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1fc80 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
1fc90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1fca0 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
1fcb0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
1fcc0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1fcd0 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
1fce0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e   return p;.}.con
1fcf0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1fd00 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
1fd10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1fd20 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
1fd30 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
1fd40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fd50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1fd60 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1fd70 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1fd80 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1fd90 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1fda0 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
1fdb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1fdc0 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
1fdd0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
1fde0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1fdf0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
1fe00 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
1fe10 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1fe20 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
1fe30 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
1fe40 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
1fe50 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
1fe60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1fe70 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
1fe80 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
1fe90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1fea0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
1feb0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
1fec0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
1fed0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
1fee0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
1fef0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
1ff00 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
1ff10 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
1ff20 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
1ff30 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
1ff40 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
1ff50 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
1ff60 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
1ff70 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
1ff80 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
1ff90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ffa0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
1ffb0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
1ffc0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1ffd0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
1ffe0 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
1fff0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
20000 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
20010 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20020 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
20030 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20040 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20050 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
20060 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
20070 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20  _DEPTH );.  if( 
20080 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
20090 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
200a0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
200b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
200c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
200d0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
200e0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
200f0 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28  pNewPage);.  if(
20100 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20110 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
20120 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b  i+1] = pNewPage;
20130 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  .  pCur->aiIdx[i
20140 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  +1] = 0;.  pCur-
20150 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75  >iPage++;..  pCu
20160 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20170 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
20180 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
20190 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
201a0 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
201b0 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
201c0 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
201d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
201e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
201f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20200 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
20210 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
20220 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
20230 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
20240 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
20250 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
20260 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
20270 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
20280 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
20290 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
202a0 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
202b0 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
202c0 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
202d0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
202e0 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
202f0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
20300 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
20310 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
20320 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
20330 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
20340 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
20350 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
20360 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
20370 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
20380 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28  hild){.  assert(
20390 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
203a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
203b0 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
203c0 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
203d0 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
203e0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
203f0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
20400 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
20410 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
20420 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
20430 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
20440 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
20450 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
20460 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
20470 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
20480 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
20490 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
204a0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
204b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
204c0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
204d0 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
204e0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
204f0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
20500 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
20510 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
20520 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
20530 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
20540 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
20550 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
20560 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
20570 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
20580 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
20590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
205a0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
205b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
205c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
205d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
205e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
205f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20600 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
20610 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
20620 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20630 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20640 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
20650 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
20660 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
20670 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
20680 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
20690 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
206a0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
206b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
206c0 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72  ]->pgno.  );.  r
206d0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
206e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
206f0 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
20700 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
20710 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
20720 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
20730 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
20740 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20750 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
20760 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
20770 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
20780 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
20790 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
207a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
207b0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
207c0 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
207d0 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
207e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
207f0 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
20800 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
20810 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
20820 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
20830 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
20840 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
20850 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
20860 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
20870 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
20880 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
20890 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
208a0 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
208b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
208c0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
208d0 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
208e0 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
208f0 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
20900 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65  VALID. Otherwise
20910 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  , the cursor is 
20920 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
20930 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c  the first.** cel
20940 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
20950 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61   root (or virtua
20960 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
20970 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
20980 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43  e.** is set to C
20990 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
209a0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
209b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
209c0 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
209d0 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
209e0 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
209f0 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
20a00 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
20a10 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
20a20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
20a30 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
20a40 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
20a50 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
20a60 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
20a70 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
20a80 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
20a90 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
20aa0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
20ab0 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
20ac0 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
20ad0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
20ae0 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
20af0 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
20b00 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
20b10 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
20b20 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
20b30 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
20b40 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
20b50 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
20b60 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
20b70 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
20b80 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
20b90 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
20ba0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20bb0 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d  Btree *p = pCur-
20bc0 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61  >pBtree;.  BtSha
20bd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20be0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
20bf0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20c00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20c10 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
20c20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
20c30 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
20c40 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
20c50 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
20c60 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
20c70 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
20c80 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
20c90 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
20ca0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
20cb0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20cc0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
20cd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
20ce0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
20cf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
20d00 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
20d10 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
20d20 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
20d30 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
20d40 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
20d50 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
20d60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
20d70 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=0 ){.    int
20d80 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
20d90 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
20da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
20db0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
20dc0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
20dd0 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
20de0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
20df0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
20e00 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
20e10 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
20e20 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
20e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
20e50 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
20e60 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
20e70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20e80 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
20e90 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  age = 0;..    /*
20ea0 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
20eb0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
20ec0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
20ed0 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
20ee0 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65   cursor.    ** e
20ef0 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
20f00 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
20f10 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
20f20 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
20f30 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  .    ** NULL, th
20f40 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
20f50 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
20f60 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
20f70 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a  the case,.    **
20f80 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
20f90 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
20fa0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
20fb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
20fc0 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
20fd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
20fe0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
20ff0 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79   if( (pCur->pKey
21000 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e  Info==0)!=pCur->
21010 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
21020 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21030 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21040 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
21050 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
21060 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  at the root page
21070 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
21080 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75  ct type. This mu
21090 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63  st be the.  ** c
210a0 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20  ase as the call 
210b0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
210c0 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65   that loaded the
210d0 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68   root-page (eith
210e0 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c  er.  ** this cal
210f0 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20  l or a previous 
21100 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c  invocation) woul
21110 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
21120 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a  corruption .  **
21130 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69   if the assumpti
21140 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
21150 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  , and it is not 
21160 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
21170 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74   flags .  ** byt
21180 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d  e to have been m
21190 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68  odified while th
211a0 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c  is cursor is hol
211b0 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
211c0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  .  ** to the pag
211d0 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d  e.  */.  pRoot =
211e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
211f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
21200 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
21210 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73  gnoRoot );.  ass
21220 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
21230 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65  it && (pCur->pKe
21240 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74  yInfo==0)==pRoot
21250 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70  ->intKey );..  p
21260 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
21270 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
21280 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
21290 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
212a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
212b0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f   = 0;..  if( pRo
212c0 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ot->nCell==0 && 
212d0 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
212e0 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
212f0 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
21300 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
21310 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21320 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
21330 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
21340 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
21350 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
21360 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
21370 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
21380 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
21390 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
213a0 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
213b0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
213c0 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
213d0 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
213e0 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
213f0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
21400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
21410 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
21420 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
21430 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
21440 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
21450 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
21460 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
21470 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
21480 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
21490 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
214a0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
214b0 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
214c0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
214d0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
214e0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
214f0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
21500 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
21510 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21520 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
21530 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
21540 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21550 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21560 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21570 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21580 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
21590 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
215a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
215b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
215c0 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
215d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
215e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
215f0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
21600 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
21610 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
21620 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
21630 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
21640 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
21650 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
21660 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
21680 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
21690 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
216a0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
216b0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
216c0 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
216d0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
216e0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
216f0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
21700 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
21710 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
21720 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
21730 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21740 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
21750 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
21760 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
21770 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
21780 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
21790 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
217a0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
217b0 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
217c0 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
217d0 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
217e0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
217f0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
21800 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
21810 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
21820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
21830 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
21840 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
21850 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
21860 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21870 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21880 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
21890 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
218a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
218b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
218c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
218d0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
218e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
218f0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
21900 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21910 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
21920 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
21930 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
21940 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
21950 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
21960 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21970 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
21980 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
21990 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
219a0 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
219b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
219c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
219d0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
219e0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
219f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
21a00 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
21a10 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
21a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21a30 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
21a40 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
21a50 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
21a60 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
21a70 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
21a80 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
21a90 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
21aa0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
21ab0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
21ac0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
21ad0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
21ae0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
21af0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21b00 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
21b10 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21b20 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
21b30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21b40 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21b50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
21b60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21b70 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
21b80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
21b90 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
21ba0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
21bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21bc0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
21bd0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
21be0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
21bf0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21c00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
21c10 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
21c20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
21c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21c40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21c50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
21c60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21c70 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
21c80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
21c90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
21ca0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
21cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
21cc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
21cd0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
21ce0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
21cf0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
21d00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21d10 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
21d20 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
21d30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
21d40 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
21d50 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
21d60 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
21d70 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
21d80 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
21d90 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
21da0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21db0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
21dc0 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
21dd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21de0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21df0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21e00 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
21e10 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
21e20 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
21e30 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
21e40 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
21e50 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
21e60 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
21e70 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
21e80 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
21e90 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
21ea0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
21eb0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
21ec0 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
21ed0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
21ee0 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
21ef0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
21f00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
21f10 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
21f20 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
21f30 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
21f40 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
21f50 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
21f60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21f70 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
21f80 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
21f90 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
21fa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
21fb0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
21fc0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
21fd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
21fe0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
21ff0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
22000 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
22010 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
22020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22030 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
22040 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
22050 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
22070 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
22080 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
22090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
220a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
220b0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
220c0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
220d0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
220e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
220f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22100 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
22110 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
22120 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
22130 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
22140 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
22150 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
22160 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
22170 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22180 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
22190 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
221a0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
221b0 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
221c0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
221d0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
221e0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
221f0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
22200 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
22210 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
22220 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
22230 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
22240 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
22250 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
22260 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
22270 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
22280 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
22290 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
222a0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
222b0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
222c0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
222d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
222e0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
222f0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
22300 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
22310 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
22320 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
22330 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
22340 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
22350 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
22360 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
22370 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
22380 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
22390 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
223a0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
223b0 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
223c0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
223d0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
223e0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
223f0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
22400 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
22410 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
22420 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
22430 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
22440 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
22450 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
22460 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
22470 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
22480 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
22490 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
224a0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
224b0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
224c0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
224d0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
224e0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
224f0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
22500 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
22510 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
22520 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
22530 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
22540 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
22570 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
22580 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
22590 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
225a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
225b0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
225c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
225d0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
225e0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
225f0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
22600 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
22610 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
22620 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22630 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22640 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
22650 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
22660 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
22670 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
22680 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
22690 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
226a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
226b0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
226c0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
226d0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
226e0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
226f0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
22700 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22720 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
22730 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
22740 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
22750 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22760 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22770 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22780 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
22790 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
227a0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
227b0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
227c0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
227d0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
227e0 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
227f0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
22800 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
22810 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
22820 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
22830 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
22840 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
22850 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
22860 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
22870 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22880 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
22890 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
228a0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
228b0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
228c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
228d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
228e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
228f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
22900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
22920 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
22930 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
22940 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
22950 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
22960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22970 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
22980 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
22990 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
229a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
229b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
229c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
229d0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
229e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
229f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22a00 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
22a10 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22a20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22a30 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d  nCell>0 || pCur-
22a40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22a50 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  INVALID );.  if(
22a60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22a70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
22a80 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
22a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22aa0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22ab0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
22ac0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
22ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
22ae0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22af0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
22b00 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
22b10 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
22b20 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50   lwr, upr;.    P
22b30 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
22b40 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
22b50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22b60 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
22b70 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70  int c;..    /* p
22b80 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
22b90 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
22ba0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
22bb0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
22bc0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
22bd0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
22be0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
22bf0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
22c00 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
22c10 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
22c20 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
22c30 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
22c40 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
22c50 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
22c60 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
22c70 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
22c80 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
22c90 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
22ca0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
22cb0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
22cc0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
22cd0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
22ce0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
22cf0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
22d00 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
22d10 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
22d20 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
22d30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22d40 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
22d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
22d60 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
22d70 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
22d80 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
22d90 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
22da0 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
22db0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
22dc0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22dd0 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20  e] = (u16)upr;. 
22de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22df0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22e00 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
22e10 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20  ((upr+lwr)/2);. 
22e20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
22e30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20  {.      int idx 
22e40 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
22e50 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49  ur->iPage]; /* I
22e60 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
22e70 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
22e80 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
22e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22eb0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
22ec0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
22ed0 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  /..      pCur->i
22ee0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
22ef0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
22f00 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
22f10 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
22f20 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  PtrSize;.      i
22f30 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
22f40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
22f50 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
22f60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
22f70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
22f80 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
22f90 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
22fa0 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
22fb0 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
22fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
22fd0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
22fe0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
22ff0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
23000 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
23010 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
23020 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
23030 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
23040 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
23050 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
23060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23070 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
23080 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
23090 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
230a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
230b0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
230c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
230d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
230e0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d  CellKey;.      }
230f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
23100 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
23110 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
23120 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e   is 32768 bytes.
23130 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
23140 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
23150 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
23160 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
23170 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
23180 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
23190 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d   ** page is at m
231a0 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20  ost 8198 bytes, 
231b0 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f  which may be sto
231c0 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
231d0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
231e0 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
231f0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
23200 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
23210 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
23220 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
23230 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
23240 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
23250 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
23260 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
23270 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
23280 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
23290 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
232a0 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
232b0 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
232c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
232d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
232e0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65   int nCell = pCe
232f0 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
23300 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38  f( !(nCell & 0x8
23310 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61  0) && nCell<=pPa
23320 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
23330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
23340 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
23350 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
23360 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
23370 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
23380 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
23390 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
233a0 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
233b0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
233c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
233d0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
233e0 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
233f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
23400 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
23410 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
23420 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
23430 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
23440 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
23450 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
23460 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
23470 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
23480 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
23490 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
234a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
234b0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
234c0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
234d0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
234e0 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
234f0 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
23500 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
23510 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
23520 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
23530 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23540 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
23550 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
23560 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
23570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23580 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
23590 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
235a0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
235b0 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
235c0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
235d0 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
235e0 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
235f0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
23600 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
23610 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
23620 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
23630 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
23640 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
23650 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
23660 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
23670 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
23680 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
23690 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
236a0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
236b0 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
236c0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
236d0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
236e0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
236f0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
23700 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
23710 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
23720 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
23730 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
23740 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
23750 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
23760 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
23770 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20   nCell );.      
23780 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
23790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
237a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
237b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
237c0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
237d0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
237e0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
237f0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
23800 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
23810 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
23820 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
23830 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
23840 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
23850 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
23860 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
23870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23880 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
23890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
238a0 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f  c ) goto moveto_
238b0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
238c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
238d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
238e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
238f0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
23900 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
23910 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
23920 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
23930 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
23940 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23960 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23980 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
23990 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
239a0 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
239b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
239c0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
239d0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
239e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
239f0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
23a00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23a10 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
23a20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23a30 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
23a40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23a50 20 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70   = (u16)((lwr+up
23a60 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
23a70 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
23a80 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
23a90 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
23aa0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
23ab0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
23ac0 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
23ad0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
23ae0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
23af0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
23b00 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
23b10 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
23b20 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
23b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
23b40 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
23b50 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
23b60 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
23b70 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
23b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23b90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23ba0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
23bb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23bc0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
23bd0 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
23be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23bf0 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
23c00 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
23c10 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
23c20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
23c30 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
23c40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23c50 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
23c60 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
23c70 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
23c80 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
23c90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
23ca0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
23cb0 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
23cc0 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
23cd0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
23ce0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
23cf0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
23d00 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
23d10 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
23d20 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
23d30 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
23d40 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
23d50 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
23d60 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
23d70 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
23d80 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
23d90 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
23da0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
23db0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
23dc0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
23dd0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
23de0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
23df0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23e00 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
23e10 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
23e20 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
23e30 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
23e40 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
23e50 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
23e60 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
23e70 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
23e80 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
23e90 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
23ea0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
23eb0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
23ec0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
23ed0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
23ee0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
23ef0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
23f00 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
23f10 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
23f20 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
23f30 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
23f40 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
23f50 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
23f60 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
23f70 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
23f80 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
23f90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
23fa0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
23fb0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
23fc0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
23fd0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
23fe0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
23ff0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
24000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
24010 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
24020 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
24030 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24040 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
24050 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24060 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
24070 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
24080 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
24090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
240a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
240b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
240c0 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res!=0 );.  if( 
240d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
240e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
240f0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24110 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
24120 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
24130 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
24140 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
24150 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
24160 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24170 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
24180 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
24190 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
241a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
241b0 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
241c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
241d0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
241e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
241f0 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50   assert( idx<=pP
24200 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
24210 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24220 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
24230 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
24240 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
24250 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
24260 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
24270 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
24280 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
24290 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
242a0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
242b0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
242c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
242d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
242e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
242f0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
24300 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
24310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24320 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
24330 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
24340 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
24350 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
24360 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
24370 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
24380 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24390 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
243a0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
243b0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
243c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
243d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
243e0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
243f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24400 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
24410 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
24420 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
24430 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
24440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24450 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
24460 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
24470 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
24480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
244a0 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
244b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
244c0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
244d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
244e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
244f0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
24500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
24510 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
24520 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
24530 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
24540 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
24550 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
24560 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
24570 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
24580 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
24590 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
245a0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
245b0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
245c0 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
245d0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
245e0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
245f0 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
24600 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
24610 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
24620 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
24630 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
24640 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
24650 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24660 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24670 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
24680 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
24690 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
246a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
246b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
246c0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
246d0 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
246e0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
246f0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
24700 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
24710 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24720 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
24730 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
24740 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
24750 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
24760 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
24770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24780 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
24790 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
247a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
247b0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
247c0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
247d0 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
247e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
247f0 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
24800 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24810 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
24820 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
24830 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
24840 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
24850 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
24860 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24870 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
24880 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
24890 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
248a0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
248b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
248c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
248d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
248e0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
248f0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
24900 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
24910 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
24920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24930 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
24940 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
24950 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
24960 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
24970 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
24980 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
24990 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
249a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
249b0 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
249c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
249d0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
249e0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
249f0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
24a00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24a10 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
24a20 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
24a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24a40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
24a60 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
24a70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
24a80 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
24a90 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
24aa0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
24ab0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
24ac0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
24ad0 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
24ae0 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
24af0 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
24b00 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
24b10 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
24b20 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
24b30 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
24b40 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
24b50 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
24b60 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
24b70 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
24b80 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
24b90 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
24ba0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
24bb0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
24bc0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24bd0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
24be0 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
24bf0 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
24c00 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
24c10 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
24c20 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
24c30 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
24c40 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
24c50 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
24c60 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
24c70 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
24c80 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
24c90 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
24ca0 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
24cb0 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
24cc0 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
24cd0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
24ce0 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
24cf0 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
24d00 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
24d10 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
24d20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
24d30 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
24d40 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
24d50 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
24d60 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
24d70 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
24d80 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
24d90 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
24da0 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
24db0 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
24dc0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
24dd0 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
24de0 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
24df0 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
24e00 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
24e10 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
24e20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
24e30 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
24e40 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
24e50 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
24e60 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
24e70 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
24e80 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
24e90 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
24ea0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
24eb0 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
24ec0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
24ed0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
24ee0 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
24ef0 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
24f00 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
24f10 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
24f20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24f30 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
24f40 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
24f50 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
24f60 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
24f70 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
24f80 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
24f90 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
24fa0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
24fb0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
24fc0 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
24fd0 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
24fe0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
24ff0 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
25000 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25010 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
25020 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
25030 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
25040 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
25050 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
25060 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
25070 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
25080 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
25090 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
250a0 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
250b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
250c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
250d0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
250e0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
250f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
25100 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
25110 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
25120 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
25130 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
25140 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
25150 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
25160 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
25170 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
25180 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
25190 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
251a0 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
251b0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
251c0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
251d0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
251e0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
251f0 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
25200 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
25210 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
25220 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
25230 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
25240 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
25250 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
25260 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
25270 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
25280 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50  t && nearby<=mxP
25290 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20  age ){.      u8 
252a0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
252b0 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
252c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
252d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
252e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
252f0 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
25300 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
25310 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
25320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
25330 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
25340 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
25350 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
25360 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
25370 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
25380 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
25390 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
253a0 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
253b0 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
253c0 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
253d0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
253e0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
253f0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
25400 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
25410 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
25420 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
25430 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
25440 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
25450 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25460 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
25470 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
25480 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
25490 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
254a0 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
254b0 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
254c0 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
254d0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
254e0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
254f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
25500 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
25510 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
25520 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
25530 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
25540 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
25550 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
25560 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
25570 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
25580 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
25590 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
255a0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
255b0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
255c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
255d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
255e0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
255f0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
25600 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
25610 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
25620 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
25630 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
25640 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
25650 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25660 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25670 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25680 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
25690 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
256a0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
256b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
256c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
256d0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
256e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
256f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25700 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20       }..      k 
25710 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
25720 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
25730 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
25740 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
25750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
25760 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
25770 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
25780 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
25790 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
257a0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
257b0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
257c0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
257d0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
257e0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
257f0 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
25800 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
25810 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
25820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25830 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
25840 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
25850 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
25860 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25870 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25890 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
258a0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
258b0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
258c0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
258d0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
258e0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
258f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
25900 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
25910 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
25920 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
25930 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
25940 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
25950 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
25960 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
25970 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
25980 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
25990 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
259a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
259b0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
259c0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
259d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
259e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
259f0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
25a00 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
25a10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
25a20 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
25a30 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
25a40 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54  st && nearby==iT
25a50 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
25a60 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
25a70 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
25a80 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
25a90 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
25aa0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
25ab0 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
25ac0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
25ad0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
25ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
25af0 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54  sert( *pPgno==iT
25b00 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20  runk );.        
25b10 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
25b20 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
25b30 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
25b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25b50 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
25b60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25b70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25b80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25b90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25bb0 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
25bc0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
25bd0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
25be0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
25bf0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
25c00 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
25c10 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
25c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25c30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
25c40 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
25c50 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
25c60 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
25c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
25c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25c90 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
25ca0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
25cb0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
25cc0 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
25cd0 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
25ce0 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
25cf0 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
25d00 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
25d10 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
25d20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
25d30 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
25d40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
25d50 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
25d60 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
25d70 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
25d80 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
25d90 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
25da0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
25db0 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
25dc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25dd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25de0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
25df0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25e00 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
25e10 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
25e20 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
25e30 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
25e40 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
25e50 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
25e60 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
25e70 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
25e80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25e90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
25ea0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
25eb0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
25ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25ee0 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
25ef0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
25f00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25f10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25f20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
25f30 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
25f40 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
25f50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
25f60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
25f70 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
25f80 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
25f90 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
25fa0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
25fb0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
25fc0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
25fd0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
25fe0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
25ff0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
26000 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
26010 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
26020 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
26030 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
26040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26050 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
26060 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
26070 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
26080 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
26090 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
260a0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
260b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
260c0 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
260d0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
260e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
260f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26100 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
26110 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
26120 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
26130 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
26140 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26150 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26170 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
26180 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
26190 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
261a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
261b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
261c0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
261d0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
261e0 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
261f0 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
26200 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
26210 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
26220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
26230 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
26240 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
26250 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
26260 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
26270 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
26280 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
26290 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
262a0 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
262b0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72  aData;.        r
262c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
262d0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
262e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
262f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26300 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26310 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26330 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
26340 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
26350 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
26360 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  t;.          clo
26370 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
26380 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62      dist = get4b
26390 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
263a0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
263b0 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20     if( dist<0 ) 
263c0 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20  dist = -dist;.  
263d0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
263e0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
263f0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
26400 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
26410 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
26420 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
26430 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d  f( d2<0 ) d2 = -
26440 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
26450 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
26470 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
26480 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
26490 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
264a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
264b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
264c0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
264d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
264e0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
264f0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
26500 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
26510 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
26520 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
26530 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
26540 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
26550 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26560 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
26570 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26580 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26590 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
265a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
265b0 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
265c0 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
265d0 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
265e0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
265f0 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
26600 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
26610 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
26620 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
26630 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
26640 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
26650 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
26660 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
26670 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
26680 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
26690 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
266a0 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
266b0 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
266c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
266d0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
266e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
266f0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
26700 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
26710 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
26720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26730 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
26740 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
26750 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
26760 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26770 61 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  able(pTrunk->pDb
26780 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
26790 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
267a0 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
267b0 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b  nt(pBt, *pPgno);
267c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
267d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
267e0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
267f0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
26800 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26820 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26830 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26840 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
26850 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26870 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26880 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26890 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
268a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
268b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
268c0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
268d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
268e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
268f0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
26900 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
26910 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
26920 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
26930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
26940 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
26950 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
26960 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
26970 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
26980 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
26990 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
269a0 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
269b0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
269c0 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65    *pPgno = nPage
269d0 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a   + 1;..    if( *
269e0 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
269f0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
26a00 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
26a10 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  +;.    }..#ifnde
26a20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26a30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
26a40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26a50 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
26a60 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
26a70 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
26a80 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
26a90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
26aa0 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
26ab0 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
26ac0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
26ad0 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
26ae0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
26af0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
26b00 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
26b10 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
26b20 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
26b30 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
26b40 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
26b50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
26b60 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
26b70 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
26b80 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
26b90 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
26ba0 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
26bb0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20  , *pPgno));.    
26bc0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
26bd0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
26be0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
26bf0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
26c00 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
26c10 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
26c20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
26c40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26c50 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
26c60 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
26c70 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
26c80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26c90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
26ca0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
26cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67  ;.      if( *pPg
26cc0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
26cd0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a  _PAGE(pBt) ){ (*
26ce0 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20  pPgno)++; }.    
26cf0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  }.#endif..    as
26d00 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
26d10 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26d20 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
26d30 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
26d40 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
26d50 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
26d60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26d80 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
26d90 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
26da0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26db0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
26dc0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
26dd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
26de0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
26df0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
26e00 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
26e10 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
26e20 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
26e30 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26e40 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
26e50 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
26e60 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
26e70 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
26e80 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  vTrunk);.  if( r
26e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26ea0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
26eb0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
26ec0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
26ed0 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
26ee0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
26ef0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
26f00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
26f10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
26f20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
26f30 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
26f40 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26f50 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
26f60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26f70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
26f80 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
26f90 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
26fa0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
26fb0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
26fc0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
26fd0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
26fe0 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
26ff0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
27000 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
27010 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
27020 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
27030 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
27040 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
27050 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
27060 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
27070 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
27080 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
27090 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
270a0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
270b0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
270c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
270d0 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
270e0 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
270f0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
27100 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
27110 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
27120 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
27130 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
27140 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
27150 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
27160 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
27170 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
27180 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
27190 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
271a0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
271b0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
271c0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
271d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
271e0 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
271f0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
27200 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
27210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27220 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
27230 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
27240 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
27250 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27260 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
27270 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
27280 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27290 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
272a0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
272b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
272c0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
272d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
272e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27310 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
27320 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
27330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27340 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
27350 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
27360 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
27370 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27380 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
27390 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
273a0 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
273b0 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
273c0 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
273d0 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
273e0 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
273f0 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
27400 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
27410 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
27420 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
27430 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
27440 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
27450 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
27460 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
27470 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
27480 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
27490 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
274a0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
274b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
274c0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
274d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
274e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
274f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
27500 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
27510 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
27520 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64   nFree+1);..#ifd
27530 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
27540 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20  _DELETE.  /* If 
27550 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52  the SQLITE_SECUR
27560 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65  E_DELETE compile
27570 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
27580 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
27590 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
275a0 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
275b0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
275c0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20  th zeros..  */. 
275d0 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
275e0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
275f0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
27600 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c  pPage, 0))).   |
27610 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63  |            (rc
27620 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27630 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
27640 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  age)).  ){.    g
27650 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27660 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
27670 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
27680 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
27690 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
276a0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
276b0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
276c0 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
276d0 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
276e0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
276f0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
27700 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
27710 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
27720 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
27730 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
27740 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
27750 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
27760 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27770 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
27780 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
27790 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
277a0 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
277b0 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
277c0 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
277d0 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
277e0 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
277f0 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
27800 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
27810 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
27820 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
27830 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
27840 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
27850 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
27860 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
27870 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
27880 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
27890 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
278a0 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
278b0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
278c0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
278d0 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
278e0 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
278f0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
27900 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
27910 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
27920 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
27930 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
27940 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
27970 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
27980 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
27990 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
279a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
279b0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
279c0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
279d0 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
279e0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
279f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
27a10 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
27a20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
27a30 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
27a40 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
27a50 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
27a60 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
27a70 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
27a80 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
27a90 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
27aa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27ab0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27ac0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
27ad0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
27ae0 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
27af0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
27b00 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
27b10 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
27b20 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
27b30 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
27b40 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
27b50 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
27b60 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
27b70 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
27b80 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
27b90 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
27ba0 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
27bb0 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
27bc0 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
27bd0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
27be0 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
27bf0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
27c00 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
27c10 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
27c20 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
27c30 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
27c40 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
27c50 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
27c60 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
27c70 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
27c80 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
27c90 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
27ca0 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
27cb0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
27cc0 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
27cd0 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
27ce0 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
27cf0 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
27d00 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
27d10 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
27d20 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
27d30 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
27d40 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
27d50 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
27d60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
27d70 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
27d80 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
27d90 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
27da0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
27db0 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
27dc0 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
27dd0 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
27de0 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
27df0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
27e00 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
27e10 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
27e20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
27e30 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
27e40 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
27e50 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
27e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
27e70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27e80 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
27e90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
27ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27eb0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
27ec0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
27ed0 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
27ee0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
27ef0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
27f00 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
27f10 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
27f20 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
27f30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
27f40 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
27f50 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
27f60 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
27f70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
27f80 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27f90 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
27fa0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
27fb0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
27fc0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
27fd0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
27fe0 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
27ff0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
28000 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
28010 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
28020 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
28030 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
28040 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
28050 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
28060 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
28070 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
28080 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
28090 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
280a0 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
280b0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
280c0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
280d0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
280e0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
280f0 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
28100 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
28110 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
28120 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
28130 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
28140 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
28150 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
28160 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
28170 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
28180 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
28190 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
281a0 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
281b0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
281c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
281d0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
281e0 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
281f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
28200 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
28210 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
28220 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
28230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28240 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
28250 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
28260 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
28270 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
28280 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
28290 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
282a0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
282b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
282c0 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
282d0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
282e0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
282f0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
28300 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
28310 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
28320 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
28330 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
28340 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
28350 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
28360 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
28370 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
28380 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
28390 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
283a0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
283b0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
283c0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
283d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
283e0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
283f0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
28400 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
28410 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
28420 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
28430 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
28440 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
28450 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
28460 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
28470 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
28480 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
28490 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
284a0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
284b0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
284c0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
284d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
284e0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f  t nOvfl;.  u16 o
284f0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
28500 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
28510 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
28520 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
28530 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
28540 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
28550 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
28560 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
28570 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
28580 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
28590 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
285a0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
285b0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
285c0 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
285d0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
285e0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
285f0 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
28600 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
28610 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
28620 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
28630 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
28640 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
28650 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
28660 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
28670 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
28680 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
28690 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
286a0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
286b0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
286c0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
286d0 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
286e0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
286f0 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
28700 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
28710 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
28720 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
28730 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
28740 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
28750 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
28760 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
28770 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
28780 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
28790 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
287a0 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
287b0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
287c0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
287d0 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
287e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
287f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
28800 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
28810 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
28820 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
28830 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
28840 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
28850 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28860 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
28870 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
28880 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
28890 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76  no);.    if( pOv
288a0 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
288b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
288c0 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
288d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
288e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
288f0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
28900 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
28910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
28920 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
28930 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
28940 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
28950 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
28960 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
28970 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
28980 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
28990 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
289a0 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
289b0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
289c0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
289d0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
289e0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
289f0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
28a00 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
28a10 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
28a20 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
28a30 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
28a40 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
28a50 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
28a60 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
28a70 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
28a80 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
28a90 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
28aa0 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
28ab0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
28ac0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
28ad0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
28ae0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
28af0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
28b00 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
28b10 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
28b20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
28b30 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
28b40 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
28b50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28b60 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
28b70 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
28b80 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28b90 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
28ba0 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
28bb0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
28bc0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
28bd0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
28be0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
28bf0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
28c00 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
28c10 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
28c20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
28c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c40 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
28c50 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
28c60 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
28c70 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
28c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
28c90 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
28ca0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
28cb0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
28cc0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
28cd0 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
28ce0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
28cf0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
28d00 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
28d10 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
28d20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
28d30 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
28d40 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
28d50 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
28d60 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
28d70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
28d80 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
28d90 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
28da0 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
28db0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
28dc0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
28dd0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
28de0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
28df0 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
28e00 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
28e10 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
28e20 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
28e30 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
28e40 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
28e50 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
28e60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
28e70 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
28e80 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
28e90 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
28ea0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
28eb0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
28ec0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
28ed0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
28ee0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
28ef0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
28f00 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
28f10 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
28f20 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
28f30 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
28f40 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
28f50 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
28f60 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
28f70 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74  l[nHeader], nDat
28f80 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73  a+nZero);.  }els
28f90 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e  e{.    nData = n
28fa0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Zero = 0;.  }.  
28fb0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
28fc0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
28fd0 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
28fe0 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ey);.  btreePars
28ff0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
29000 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
29010 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
29020 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
29030 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
29040 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
29050 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
29060 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
29070 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
29080 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
29090 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
290a0 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
290b0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
290c0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
290d0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
290e0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
290f0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
29100 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
29110 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37  ( NEVER(nKey>0x7
29120 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d  fffffff || pKey=
29130 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  =0) ){.      ret
29140 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29150 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
29160 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
29170 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
29180 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
29190 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
291a0 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
291b0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
291c0 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
291d0 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
291e0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
291f0 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
29200 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
29210 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
29220 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
29230 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
29240 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
29250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29260 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
29270 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
29280 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
29290 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
292a0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
292b0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
292c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
292d0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
292e0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
292f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
29300 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
29310 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
29320 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
29330 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
29340 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
29350 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
29360 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
29370 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
29380 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
29390 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
293a0 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
293b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
293c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
293d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
293e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
293f0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
29400 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
29410 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
29420 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
29430 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
29440 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
29450 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
29460 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
29470 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
29480 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
29490 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
294a0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
294b0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
294c0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
294d0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
294e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
294f0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
29500 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
29510 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
29520 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
29530 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
29540 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
29550 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
29560 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
29570 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
29580 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
29590 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
295a0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
295b0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
295c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
295d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
295e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
295f0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
29600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
29610 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
29620 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
29630 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
29640 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
29650 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
29660 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c  pgnoOvfl, eType,
29670 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63   pgnoPtrmap, &rc
29680 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29690 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
296a0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
296b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
296c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
296d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
296e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
296f0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
29700 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29710 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
29720 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
29730 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
29740 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
29750 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
29760 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
29770 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
29780 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
29790 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
297a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
297b0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
297c0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
297d0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
297e0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
297f0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
29800 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
29810 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
29820 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
29830 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
29840 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
29850 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
29860 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29870 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
29880 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
29890 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
298a0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
298b0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
298c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
298d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
298e0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
298f0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
29900 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
29910 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
29920 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
29930 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
29940 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
29950 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
29960 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
29970 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
29980 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
29990 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
299a0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
299b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
299c0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
299d0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
299e0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
299f0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
29a00 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
29a10 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
29a20 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
29a30 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
29a40 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
29a50 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
29a60 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
29a70 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
29a80 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
29a90 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
29aa0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
29ab0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29ac0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
29ad0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
29ae0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
29af0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
29b00 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
29b10 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
29b20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
29b30 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
29b40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
29b50 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
29b60 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
29b70 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
29b80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
29b90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
29ba0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
29bb0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
29bc0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
29bd0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
29be0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
29bf0 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
29c00 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
29c10 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
29c20 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
29c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29c40 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
29c50 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
29c60 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
29c70 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
29c80 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
29c90 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
29ca0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
29cb0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
29cc0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
29cd0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
29ce0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
29cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29d00 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
29d10 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
29d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29d30 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
29d40 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
29d50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
29d60 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
29d70 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
29d80 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
29d90 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
29da0 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
29db0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
29dc0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
29dd0 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
29de0 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
29df0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
29e00 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
29e10 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
29e20 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
29e30 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
29e40 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
29e50 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
29e60 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
29e70 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28  c void dropCell(
29e80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
29e90 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c  int idx, int sz,
29ea0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e   int *pRC){.  in
29eb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  t i;          /*
29ec0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
29ed0 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
29ee0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29ef0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
29f00 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
29f10 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
29f20 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
29f30 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
29f40 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
29f50 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
29f60 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
29f70 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
29f80 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
29f90 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
29fa0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
29fb0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
29fc0 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
29fd0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
29fe0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
29ff0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2a000 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2a010 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
2a020 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2a030 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2a040 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
2a050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a060 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a070 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2a080 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2a090 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a0a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2a0b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
2a0c0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2a0d0 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
2a0e0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2a0f0 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
2a100 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
2a110 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
2a120 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
2a130 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
2a140 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2a150 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
2a160 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
2a170 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2a180 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 67   );.  if( pc < g
2a190 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2a1a0 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
2a1b0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2a1c0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
2a1d0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2a1e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
2a1f0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
2a200 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
2a210 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
2a220 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
2a230 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2a240 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69  n;.  }.  for(i=i
2a250 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  dx+1; i<pPage->n
2a260 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d  Cell; i++, ptr+=
2a270 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d  2){.    ptr[0] =
2a280 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72   ptr[2];.    ptr
2a290 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20  [1] = ptr[3];.  
2a2a0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2a2b0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2a2c0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2a2d0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2a2e0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2a2f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2a300 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2a310 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2a320 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2a330 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2a340 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2a350 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2a360 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2a370 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2a380 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2a390 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2a3a0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2a3b0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2a3c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2a3d0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2a3e0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2a3f0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2a400 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2a410 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2a420 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2a430 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
2a440 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2a450 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2a460 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2a470 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2a480 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2a490 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2a4a0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2a4b0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2a4c0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2a4d0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2a4e0 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2a4f0 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2a500 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2a510 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2a520 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2a530 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2a540 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2a550 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2a560 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2a570 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2a580 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a590 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2a5a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2a5b0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2a5c0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2a5d0 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2a5e0 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2a5f0 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2a600 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2a610 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2a620 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2a630 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2a640 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2a650 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2a660 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2a670 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2a680 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2a690 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2a6a0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2a6b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2a6c0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2a6d0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2a6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2a6f0 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2a700 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2a710 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2a720 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2a730 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2a740 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2a750 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2a760 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2a770 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2a780 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2a790 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2a7a0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2a7b0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2a7c0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2a7d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2a7e0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
2a7f0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2a800 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2a810 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2a820 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2a830 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a840 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2a850 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a860 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2a870 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2a880 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2a890 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2a8a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2a8b0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2a8c0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2a8d0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2a8e0 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2a8f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2a900 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2a910 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2a920 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2a930 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2a940 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2a950 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2a960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2a970 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2a980 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2a990 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
2a9a0 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
2a9b0 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
2a9c0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2a9d0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2a9e0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
2a9f0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
2aa00 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
2aa10 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2aa20 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2aa30 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2aa40 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
2aa50 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
2aa60 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2aa70 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
2aa80 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20  ge->aOvfl) );.  
2aa90 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
2aaa0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2aab0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
2aac0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2aad0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2aae0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2aaf0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2ab00 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
2ab10 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
2ab20 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
2ab30 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
2ab40 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
2ab50 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2ab60 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
2ab70 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
2ab80 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2ab90 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
2aba0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2abb0 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
2abc0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
2abd0 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
2abe0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2abf0 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
2ac00 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  e->aOvfl[0])) );
2ac10 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
2ac20 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
2ac30 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
2ac40 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75  Ovfl[j].idx = (u
2ac50 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  16)i;.  }else{. 
2ac60 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
2ac70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2ac80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2ac90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2aca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
2acb0 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
2acc0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
2acd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ace0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2acf0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2ad00 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
2ad10 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
2ad20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
2ad30 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
2ad40 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f  .    end = cellO
2ad50 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
2ad60 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20  >nCell;.    ins 
2ad70 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2ad80 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  *i;.    rc = all
2ad90 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
2ada0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
2adb0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
2adc0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
2add0 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
2ade0 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
2adf0 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
2ae00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2ae10 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
2ae20 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
2ae30 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61  success */.    a
2ae40 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e  ssert( idx >= en
2ae50 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d+2 );.    asser
2ae60 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61  t( idx+sz <= pPa
2ae70 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2ae80 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
2ae90 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
2aea0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2aeb0 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
2aec0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
2aed0 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
2aee0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
2aef0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
2af00 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2af10 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
2af20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
2af30 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74     for(j=end, pt
2af40 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
2af50 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
2af60 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
2af70 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
2af80 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
2af90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
2afa0 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
2afb0 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
2afc0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
2afd0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
2afe0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
2aff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b000 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2b010 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
2b020 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2b030 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
2b040 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
2b050 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
2b060 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
2b070 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
2b080 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
2b090 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2b0a0 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
2b0b0 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
2b0c0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2b0d0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
2b0e0 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
2b0f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
2b100 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
2b110 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
2b120 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
2b130 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
2b140 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
2b150 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
2b160 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
2b170 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2b180 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
2b190 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
2b1a0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
2b1b0 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
2b1c0 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
2b1d0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
2b1e0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2b1f0 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
2b200 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2b210 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
2b220 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2b230 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
2b240 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
2b250 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
2b260 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
2b270 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2b280 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2b290 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
2b2a0 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
2b2b0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2b2c0 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
2b2d0 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
2b2e0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2b2f0 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
2b300 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
2b310 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2b320 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2b330 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
2b340 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
2b350 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
2b360 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2b370 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2b380 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
2b390 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
2b3a0 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
2b3b0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
2b3c0 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
2b3d0 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
2b3e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2b3f0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b400 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2b410 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b420 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2b430 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2b440 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
2b450 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2b460 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2b470 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2b480 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
2b490 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2b4a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2b4b0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2b4c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2b4d0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
2b4e0 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
2b4f0 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
2b500 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b510 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2b520 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
2b530 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
2b540 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
2b550 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50  llptr = &data[pP
2b560 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
2b570 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  + nCell*2];.  ce
2b580 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
2b590 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
2b5a0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2b5b0 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2b5c0 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2b5d0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
2b5e0 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
2b5f0 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
2b600 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
2b610 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
2b620 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
2b630 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
2b640 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
2b650 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
2b660 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
2b670 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
2b680 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
2b690 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
2b6a0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2b6b0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
2b6c0 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
2b6d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
2b6e0 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
2b6f0 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
2b700 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
2b710 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
2b720 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2b730 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
2b740 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
2b750 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2b760 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
2b770 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
2b780 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
2b790 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2b7a0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
2b7b0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2b7c0 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
2b7d0 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
2b7e0 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
2b7f0 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
2b800 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2b810 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
2b820 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
2b830 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
2b840 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
2b850 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
2b860 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
2b870 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
2b880 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
2b890 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
2b8a0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
2b8b0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
2b8c0 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
2b8d0 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
2b8e0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
2b8f0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
2b900 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
2b910 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
2b920 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
2b930 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
2b940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b950 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2b960 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2b970 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
2b980 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
2b990 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
2b9a0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
2b9b0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
2b9c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b9d0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2b9e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
2b9f0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
2ba00 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
2ba10 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
2ba20 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
2ba30 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
2ba40 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
2ba50 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
2ba60 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
2ba70 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
2ba80 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
2ba90 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
2baa0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
2bab0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
2bac0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
2bad0 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
2bae0 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
2baf0 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
2bb00 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
2bb10 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
2bb20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
2bb30 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
2bb40 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
2bb50 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
2bb60 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
2bb70 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
2bb80 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
2bb90 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
2bba0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
2bbb0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
2bbc0 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
2bbd0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
2bbe0 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
2bbf0 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
2bc00 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
2bc10 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
2bc20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
2bc30 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
2bc40 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
2bc50 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
2bc60 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
2bc70 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
2bc80 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
2bc90 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
2bca0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
2bcb0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
2bcc0 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
2bcd0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
2bce0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
2bcf0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2bd00 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
2bd10 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
2bd20 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
2bd30 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
2bd40 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
2bd50 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
2bd60 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
2bd70 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
2bd80 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
2bd90 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
2bda0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2bdb0 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
2bdc0 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
2bdd0 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
2bde0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
2bdf0 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
2be00 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
2be10 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
2be20 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
2be30 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
2be40 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
2be50 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
2be60 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
2be70 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
2be80 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
2be90 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
2bea0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bec0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
2bed0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2bee0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2bf10 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
2bf20 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2bf50 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
2bf60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2bf70 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2bf80 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2bf90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2bfa0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bfb0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2bfc0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
2bfd0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2bfe0 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70  w==1 );..  if( p
2bff0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29  Page->nCell<=0 )
2c000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2c010 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
2c020 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
2c030 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
2c040 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
2c050 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
2c060 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
2c070 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
2c080 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
2c090 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
2c0a0 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
2c0b0 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
2c0c0 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
2c0d0 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
2c0e0 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
2c0f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
2c100 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2c110 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
2c120 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
2c130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c140 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
2c150 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
2c160 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2c170 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b   = pPage->aOvfl[
2c180 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31  0].pCell;.    u1
2c190 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53  6 szCell = cellS
2c1a0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2c1b0 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53  ell);.    u8 *pS
2c1c0 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  top;..    assert
2c1d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2c1e0 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
2c1f0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2c200 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
2c210 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e  Data[0]==(PTF_IN
2c220 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2c230 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20  A|PTF_LEAF) );. 
2c240 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
2c250 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
2c260 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2c270 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  AF);.    assembl
2c280 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  ePage(pNew, 1, &
2c290 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
2c2a0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2c2b0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2c2c0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2c2d0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
2c2e0 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
2c2f0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
2c300 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
2c310 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
2c320 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
2c330 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
2c340 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2c350 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
2c360 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  ese.    ** opera
2c370 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65  tions fails, the
2c380 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
2c390 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e  set, but the con
2c3a0 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  tents.    ** of 
2c3b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2c3c0 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75  are still manipu
2c3d0 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64  lated by thh cod
2c3e0 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20  e below..    ** 
2c3f0 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74  That is Ok, at t
2c400 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
2c410 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61  rent page is gua
2c420 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a  ranteed to.    *
2c430 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  * be marked as d
2c440 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20  irty. Returning 
2c450 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69  an error code wi
2c460 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a  ll cause a.    *
2c470 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f  * rollback, undo
2c480 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ing any changes 
2c490 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65  made to the pare
2c4a0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
2c4b0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2c4c0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
2c4d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2c4e0 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52  oNew, PTRMAP_BTR
2c4f0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2c500 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
2c510 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e  f( szCell>pNew->
2c520 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
2c530 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
2c540 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
2c550 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
2c560 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2c570 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72  Create a divider
2c580 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20   cell to insert 
2c590 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68  into pParent. Th
2c5a0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  e divider cell. 
2c5b0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f     ** consists o
2c5c0 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20  f a 4-byte page 
2c5d0 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65  number (the page
2c5e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65   number of pPage
2c5f0 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76  ) and.    ** a v
2c600 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b  ariable length k
2c610 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20  ey value (which 
2c620 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
2c630 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20   value as the.  
2c640 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
2c650 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20   on pPage)..    
2c660 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e  **.    ** To fin
2c670 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  d the largest ke
2c680 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65  y value on pPage
2c690 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65  , first find the
2c6a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20   right-most .   
2c6b0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2c6c0 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f  e. The first two
2c6d0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20   fields of this 
2c6e0 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20  cell are the .  
2c6f0 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67    ** record-leng
2c700 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  th (a variable l
2c710 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74  ength integer at
2c720 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e   most 32-bits in
2c730 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e   size).    ** an
2c740 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  d the key value 
2c750 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
2c760 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20  th integer, may 
2c770 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e  have any value).
2c780 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
2c790 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e  t of the while(.
2c7a0 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20  ..) loops below 
2c7b0 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72  skips over the r
2c7c0 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20  ecord-length.   
2c7d0 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73   ** field. The s
2c7e0 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29  econd while(...)
2c7f0 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65   loop copies the
2c800 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20   key value from 
2c810 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  the.    ** cell 
2c820 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68  on pPage into th
2c830 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  e pSpace buffer.
2c840 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c  .    */.    pCel
2c850 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2c860 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge, pPage->nCell
2c870 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  -1);.    pStop =
2c880 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
2c890 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b  while( (*(pCell+
2c8a0 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  +)&0x80) && pCel
2c8b0 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70  l<pStop );.    p
2c8c0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
2c8d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a  ;.    while( ((*
2c8e0 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65  (pOut++) = *(pCe
2c8f0 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20  ll++))&0x80) && 
2c900 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a  pCell<pStop );..
2c910 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
2c920 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2c930 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ll into pParent.
2c940 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65   */.    insertCe
2c950 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72  ll(pParent, pPar
2c960 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61  ent->nCell, pSpa
2c970 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70  ce, (int)(pOut-p
2c980 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20  Space),.        
2c990 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d         0, pPage-
2c9a0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20  >pgno, &rc);..  
2c9b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
2c9c0 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
2c9d0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
2c9e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2c9f0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
2ca00 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2ca10 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2ca20 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2ca30 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
2ca40 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
2ca50 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
2ca60 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
2ca70 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
2ca80 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2ca90 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2caa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2cab0 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
2cac0 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
2cad0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2cae0 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
2caf0 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
2cb00 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
2cb10 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
2cb20 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
2cb30 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
2cb40 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
2cb50 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
2cb60 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
2cb70 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
2cb80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2cb90 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
2cba0 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
2cbb0 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
2cbc0 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
2cbd0 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
2cbe0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
2cbf0 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
2cc00 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
2cc10 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
2cc20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2cc30 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
2cc40 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2cc50 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
2cc60 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
2cc70 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
2cc80 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2cc90 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
2cca0 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
2ccb0 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
2ccc0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
2ccd0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c  ellPtr(pPage, z,
2cce0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69   &info);.      i
2ccf0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
2cd00 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  w ){.        Pgn
2cd10 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
2cd20 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  e(&z[info.iOverf
2cd30 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  low]);.        p
2cd40 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76  trmapGet(pBt, ov
2cd50 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  fl, &e, &n);.   
2cd60 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2cd70 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2cd80 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
2cd90 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  W1 );.      }.  
2cda0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2cdb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2cdc0 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
2cdd0 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20  4byte(z);.      
2cde0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2cdf0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2ce00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ce10 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2ce20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2ce30 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  EE );.      }.  
2ce40 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61    }.    if( !pPa
2ce50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ce60 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2ce70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2ce80 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2ce90 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2cea0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2ceb0 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b   child, &e, &n);
2cec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2ced0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2cee0 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
2cef0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
2cf00 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
2cf10 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
2cf20 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2cf30 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  to copy the cont
2cf40 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72  ents of the b-tr
2cf50 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a  ee node stored .
2cf60 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d  ** on page pFrom
2cf70 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66   to page pTo. If
2cf80 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20   page pFrom was 
2cf90 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c  not a leaf page,
2cfa0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69   then.** the poi
2cfb0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2cfc0 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20   for each child 
2cfd0 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64  page are updated
2cfe0 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
2cff0 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72  parent page stor
2d000 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ed in the pointe
2d010 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54  r map is page pT
2d020 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74  o. If pFrom cont
2d030 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c  ained.** any cel
2d040 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  ls with overflow
2d050 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20   page pointers, 
2d060 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70  then the corresp
2d070 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a  onding pointer.*
2d080 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72  * map entries ar
2d090 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73  e also updated s
2d0a0 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e  o that the paren
2d0b0 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70  t page is page p
2d0c0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  To..**.** If pFr
2d0d0 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  om is currently 
2d0e0 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65  carrying any ove
2d0f0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74  rflow cells (ent
2d100 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d  ries in the.** M
2d110 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61  emPage.aOvfl[] a
2d120 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20  rray), they are 
2d130 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54  not copied to pT
2d140 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  o. .**.** Before
2d150 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65   returning, page
2d160 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61   pTo is reinitia
2d170 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65  lized using btre
2d180 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
2d190 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e  ** The performan
2d1a0 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
2d1b0 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69  ion is not criti
2d1c0 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  cal. It is only 
2d1d0 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20  used by .** the 
2d1e0 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2d1f0 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f  r() and balance_
2d200 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75  deeper() procedu
2d210 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a  res, neither of.
2d220 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c  ** which are cal
2d230 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20  led often under 
2d240 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61  normal circumsta
2d250 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nces..*/.static 
2d260 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  void copyNodeCon
2d270 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46  tent(MemPage *pF
2d280 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54  rom, MemPage *pT
2d290 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  o, int *pRC){.  
2d2a0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2d2b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53  TE_OK ){.    BtS
2d2c0 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42  hared * const pB
2d2d0 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a  t = pFrom->pBt;.
2d2e0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61      u8 * const a
2d2f0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44  From = pFrom->aD
2d300 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  ata;.    u8 * co
2d310 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61  nst aTo = pTo->a
2d320 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f  Data;.    int co
2d330 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2d340 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2d350 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  .    int const i
2d360 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70  ToHdr = ((pTo->p
2d370 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20  gno==1) ? 100 : 
2d380 30 29 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59  0);.    TESTONLY
2d390 28 69 6e 74 20 72 63 3b 29 0a 20 20 20 20 69 6e  (int rc;).    in
2d3a0 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
2d3b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2d3c0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2d3d0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
2d3e0 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
2d3f0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
2d400 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2d410 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75  mHdr+5])<=pBt->u
2d420 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
2d430 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2d440 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
2d450 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
2d460 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2d470 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
2d480 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2d490 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
2d4a0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
2d4b0 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
2d4c0 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
2d4d0 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
2d4e0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
2d4f0 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
2d500 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
2d510 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
2d520 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
2d530 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
2d540 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
2d550 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2d560 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
2d570 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
2d580 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
2d590 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
2d5a0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
2d5b0 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61  "cannot" fail, a
2d5c0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  s the.    ** dat
2d5d0 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46  a copied from pF
2d5e0 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20  rom is known to 
2d5f0 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20  be valid.  */.  
2d600 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
2d610 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59 28  0;.    TESTONLY(
2d620 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e 69 74  rc = ) btreeInit
2d630 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 61  Page(pTo);.    a
2d640 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2d650 45 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20 20 2f  E_OK );.  .    /
2d660 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2d670 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2d680 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2d690 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2d6a0 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ries.    ** for 
2d6b0 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76  any b-tree or ov
2d6c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
2d6d0 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69  t pTo now contai
2d6e0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20  ns the pointers 
2d6f0 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  to..    */.    i
2d700 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2d710 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
2d720 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2d730 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pTo);.    }.  }.
2d740 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2d750 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
2d760 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  tes cells on the
2d770 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63   iParentIdx'th c
2d780 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a  hild of pParent.
2d790 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74  ** (hereafter "t
2d7a0 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70  he page") and up
2d7b0 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73   to 2 siblings s
2d7c0 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
2d7d0 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a   have about the.
2d7e0 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  ** same amount o
2d7f0 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73  f free space. Us
2d800 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73  ually a single s
2d810 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72  ibling on either
2d820 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20   side of the.** 
2d830 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e  page are used in
2d840 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
2d850 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c  though both sibl
2d860 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20  ings might come 
2d870 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65  from one.** side
2d880 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2d890 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73  the first or las
2d8a0 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70  t child of its p
2d8b0 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61  arent. If the pa
2d8c0 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72  ge .** has fewer
2d8d0 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73   than 2 siblings
2d8e0 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63   (something whic
2d8f0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
2d900 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a  n if the page.**
2d910 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20   is a root page 
2d920 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20  or a child of a 
2d930 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20  root page) then 
2d940 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
2d950 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63  blings.** partic
2d960 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2d970 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ancing..**.** Th
2d980 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c  e number of sibl
2d990 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
2d9a0 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61   might be increa
2d9b0 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64  sed or decreased
2d9c0 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74   by .** one or t
2d9d0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
2d9e0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
2d9f0 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
2da00 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a  t over full. .**
2da10 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68  .** Note that wh
2da20 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2da30 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20  is called, some 
2da40 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
2da50 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68  the page.** migh
2da60 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
2da70 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50  e stored in MemP
2da80 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69  age.aData[]. Thi
2da90 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
2daa0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
2dab0 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f  verfull. This ro
2dac0 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2dad0 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c  at all cells all
2dae0 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  ocated.** to the
2daf0 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
2db00 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20  blings fit into 
2db10 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20  MemPage.aData[] 
2db20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2db30 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63  ..**.** In the c
2db40 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69  ourse of balanci
2db50 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  ng the page and 
2db60 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65  its siblings, ce
2db70 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e  lls may be.** in
2db80 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72  serted into or r
2db90 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
2dba0 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  parent page (pPa
2dbb0 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a  rent). Doing so.
2dbc0 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ** may cause the
2dbd0 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20   parent page to 
2dbe0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
2dbf0 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66  or underfull. If
2dc00 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73   this.** happens
2dc10 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
2dc20 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2dc30 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f  e caller to invo
2dc40 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ke the correct.*
2dc50 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  * balancing rout
2dc60 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20  ine to fix this 
2dc70 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65  problem (see the
2dc80 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69   balance() routi
2dc90 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ne). .**.** If t
2dca0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2dcb0 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
2dcc0 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65  , it might leave
2dcd0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
2dce0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20   in a corrupted 
2dcf0 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69  state. So if thi
2dd00 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c  s routine fails,
2dd10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
2dd20 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65  ould.** be rolle
2dd30 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2dd40 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2dd50 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2dd60 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69  n, aOvflSpace, i
2dd70 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2dd80 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65  .** buffer big e
2dd90 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e  nough to hold on
2dda0 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65  e page. If while
2ddb0 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
2ddc0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2ddd0 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
2dde0 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  t) the parent pa
2ddf0 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
2de00 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72  ull, this buffer
2de10 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73   is.** used to s
2de20 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27  tore the parent'
2de30 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
2de40 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
2de50 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
2de60 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
2de70 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
2de80 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2de90 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
2dea0 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
2deb0 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
2dec0 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
2ded0 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
2dee0 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
2def0 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
2df00 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
2df10 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
2df20 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2df30 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
2df40 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
2df50 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
2df60 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
2df70 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
2df80 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2df90 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
2dfa0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
2dfb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2dfc0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
2dfd0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2dfe0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
2dff0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2e000 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
2e010 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2e020 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
2e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e040 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
2e050 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
2e060 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
2e070 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
2e080 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
2e090 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
2e0a0 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
2e0b0 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
2e0c0 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
2e0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e0e0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
2e0f0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b   root-page */.){
2e100 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e120 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
2e130 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
2e140 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2e150 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e160 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
2e170 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2e180 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
2e190 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2e1a0 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
2e1b0 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
2e1c0 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
2e1d0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
2e1e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e1f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
2e200 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
2e210 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2e220 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e230 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
2e240 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
2e250 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
2e260 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2e270 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2e280 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
2e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2e2a0 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
2e2b0 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
2e2c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
2e2d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e2e0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2e2f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
2e300 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2e310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
2e320 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2e330 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
2e340 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e360 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
2e370 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
2e380 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
2e390 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
2e3a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2e3b0 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
2e3c0 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
2e3d0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
2e3e0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2e3f0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2e400 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2e410 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
2e420 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2e430 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
2e440 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
2e450 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
2e460 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
2e470 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2e480 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2e490 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
2e4a0 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
2e4b0 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
2e4c0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
2e4d0 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
2e4e0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
2e4f0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
2e500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2e510 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
2e520 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
2e530 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
2e540 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
2e550 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
2e560 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
2e570 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2e580 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
2e590 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
2e5a0 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
2e5b0 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
2e5c0 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
2e5d0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2e5e0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
2e5f0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
2e600 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
2e610 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
2e620 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
2e630 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
2e640 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
2e650 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
2e660 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
2e670 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
2e680 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
2e690 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
2e6a0 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
2e6b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e6c0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
2e6d0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
2e6e0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
2e6f0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2e700 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
2e710 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
2e720 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
2e730 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2e740 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2e750 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2e760 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
2e770 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2e780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e790 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2e7a0 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
2e7b0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
2e7c0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
2e7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
2e7e0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
2e7f0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
2e800 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
2e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e820 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
2e830 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
2e840 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
2e850 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
2e860 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2e870 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2e880 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2e890 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e8a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e8b0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2e8c0 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
2e8d0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2e8e0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
2e8f0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
2e900 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
2e910 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
2e920 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
2e930 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
2e940 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
2e950 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
2e960 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
2e970 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
2e980 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
2e990 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
2e9a0 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
2e9b0 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
2e9c0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
2e9d0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
2e9e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
2e9f0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
2ea00 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
2ea10 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2ea20 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
2ea30 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
2ea40 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
2ea50 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
2ea60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ea70 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2ea80 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2ea90 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50  aOvfl[0].idx==iP
2eaa0 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69  arentIdx );..  i
2eab0 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29  f( !aOvflSpace )
2eac0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ead0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
2eae0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69    /* Find the si
2eaf0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62  bling pages to b
2eb00 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63  alance. Also loc
2eb10 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e  ate the cells in
2eb20 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74   pParent .  ** t
2eb30 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73  hat divide the s
2eb40 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65  iblings. An atte
2eb50 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66  mpt is made to f
2eb60 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  ind NN siblings 
2eb70 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  on .  ** either 
2eb80 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d  side of pPage. M
2eb90 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  ore siblings are
2eba0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20   taken from one 
2ebb0 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a  side, however, .
2ebc0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72    ** if there ar
2ebd0 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
2ebe0 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
2ebf0 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70  other side. If p
2ec00 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
2ec10 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
2ec20 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
2ec30 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
2ec40 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20  t are taken.  . 
2ec50 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
2ec60 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68  op also drops th
2ec70 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
2ec80 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2ec90 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  page. This.  ** 
2eca0 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64  way, the remaind
2ecb0 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  er of the functi
2ecc0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  on does not have
2ecd0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e   to deal with an
2ece0 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  y.  ** overflow 
2ecf0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72  cells in the par
2ed00 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20  ent page, since 
2ed10 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74  if any existed t
2ed20 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61  hey will.  ** ha
2ed30 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
2ed40 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  removed..  */.  
2ed50 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
2ed60 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
2ed70 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
2ed80 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
2ed90 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
2eda0 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
2edb0 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
2edc0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2edd0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
2ede0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
2edf0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
2ee00 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2ee10 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
2ee20 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
2ee30 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
2ee40 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
2ee50 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
2ee60 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
2ee70 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2ee80 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
2ee90 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2eea0 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
2eeb0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2eec0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
2eed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
2eee0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
2eef0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2ef00 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2ef10 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
2ef20 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
2ef30 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
2ef40 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2ef50 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2ef60 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
2ef70 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ef80 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
2ef90 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
2efa0 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
2efb0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2efc0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a  _cleanup;.    }.
2efd0 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
2efe0 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
2eff0 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
2f000 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
2f010 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b  (i--)==0 ) break
2f020 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44  ;..    if( i+nxD
2f030 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76  iv==pParent->aOv
2f040 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61  fl[0].idx && pPa
2f050 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
2f060 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
2f070 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76  ] = pParent->aOv
2f080 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
2f090 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2f0a0 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
2f0b0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
2f0c0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
2f0d0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
2f0e0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f       pParent->nO
2f0f0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
2f100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70   }else{.      ap
2f110 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
2f120 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
2f130 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
2f140 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67  rflow);.      pg
2f150 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
2f160 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
2f170 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
2f180 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
2f190 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20  pDiv[i]);..     
2f1a0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c   /* Drop the cel
2f1b0 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  l from the paren
2f1c0 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d  t page. apDiv[i]
2f1d0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
2f1e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65  .      ** the ce
2f1f0 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ll within the pa
2f200 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  rent, even thoug
2f210 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72  h it has been dr
2f220 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  opped..      ** 
2f230 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
2f240 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20  ause dropping a 
2f250 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72  cell only overwr
2f260 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20  ites the first. 
2f270 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
2f280 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68  es of it, and th
2f290 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
2f2a0 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69   not need the fi
2f2b0 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
2f2c0 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64  r bytes of the d
2f2d0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20  ivider cell. So 
2f2e0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
2f2f0 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20  afe to use.     
2f300 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a   ** later on.  .
2f310 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2f320 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20  * Unless SQLite 
2f330 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73  is compiled in s
2f340 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2f350 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
2f360 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72  .      ** the dr
2f370 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65  opCell() routine
2f380 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
2f390 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2f3a0 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20  with zeroes..   
2f3b0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2f3c0 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  se, temporarily 
2f3d0 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e  copy the cell in
2f3e0 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  to the aOvflSpac
2f3f0 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66  e[].      ** buf
2f400 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20  fer. It will be 
2f410 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e  copied out again
2f420 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
2f430 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a  aSpace[] buffer.
2f440 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f        ** is allo
2f450 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65  cated.  */.#ifde
2f460 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
2f470 44 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d  DELETE.      mem
2f480 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b  cpy(&aOvflSpace[
2f490 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
2f4a0 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b  ->aData], apDiv[
2f4b0 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
2f4c0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2f4d0 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2f4e0 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2f4f0 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ata];.#endif.   
2f500 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72     dropCell(pPar
2f510 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
2f520 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c  rent->nOverflow,
2f530 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b   szNew[i], &rc);
2f540 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2f550 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20   Make nMaxCells 
2f560 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20  a multiple of 4 
2f570 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73  in order to pres
2f580 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a  erve 8-byte.  **
2f590 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20   alignment */.  
2f5a0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61  nMaxCells = (nMa
2f5b0 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a  xCells + 3)&~3;.
2f5c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
2f5d0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65  ate space for me
2f5e0 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a  mory structures.
2f5f0 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e    */.  k = pBt->
2f600 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44  pageSize + ROUND
2f610 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
2f620 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20  ));.  szScratch 
2f630 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c  =.       nMaxCel
2f640 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20  ls*sizeof(u8*)  
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a       /* apCell *
2f670 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c  /.     + nMaxCel
2f680 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20  ls*sizeof(u16)  
2f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6a0 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a       /* szCell *
2f6b0 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61  /.     + pBt->pa
2f6c0 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  geSize          
2f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6e0 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20       /* aSpace1 
2f6f0 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64  */.     + k*nOld
2f700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f720 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
2f730 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f  pies (apCopy) */
2f740 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
2f750 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
2f760 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a  ( szScratch ); .
2f770 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
2f780 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2f790 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2f7a0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2f7b0 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c  up;.  }.  szCell
2f7c0 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
2f7d0 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
2f7e0 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73  Space1 = (u8*)&s
2f7f0 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
2f800 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2f810 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2f820 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20  (aSpace1) );..  
2f830 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
2f840 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
2f850 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
2f860 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
2f870 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2f880 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
2f890 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
2f8a0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2f8b0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2f8c0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
2f8d0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53  obtained from aS
2f8e0 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
2f8f0 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
2f900 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
2f910 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
2f920 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
2f930 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
2f940 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
2f950 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2f960 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
2f970 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
2f980 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
2f990 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
2f9a0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
2f9b0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
2f9c0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
2f9d0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2f9e0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
2f9f0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
2fa00 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
2fa10 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2fa20 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
2fa30 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
2fa40 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
2fa50 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
2fa60 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
2fa70 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
2fa80 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
2fa90 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
2faa0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
2fab0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
2fac0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
2fad0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
2fae0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
2faf0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
2fb00 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
2fb10 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
2fb20 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
2fb30 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
2fb40 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
2fb50 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
2fb60 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
2fb70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2fb80 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
2fb90 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
2fba0 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
2fbb0 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
2fbc0 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
2fbd0 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
2fbe0 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
2fbf0 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
2fc00 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
2fc10 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
2fc20 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
2fc30 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
2fc40 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2fc50 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
2fc60 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
2fc70 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
2fc80 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
2fc90 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
2fca0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
2fcb0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
2fcc0 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
2fcd0 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
2fce0 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
2fcf0 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
2fd00 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
2fd10 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
2fd20 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
2fd30 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
2fd40 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
2fd50 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
2fd60 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
2fd70 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
2fd80 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
2fd90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
2fda0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
2fdb0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
2fdc0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
2fdd0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
2fde0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
2fdf0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
2fe00 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
2fe10 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
2fe20 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
2fe30 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
2fe40 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
2fe50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fe60 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61  i<nOld-1 && !lea
2fe70 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31  fData){.      u1
2fe80 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65  6 sz = (u16)szNe
2fe90 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a  w[i];.      u8 *
2fea0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  pTemp;.      ass
2feb0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
2fec0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a  ells );.      sz
2fed0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2fee0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
2fef0 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31  &aSpace1[iSpace1
2ff00 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31  ];.      iSpace1
2ff10 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
2ff20 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70  sert( sz<=pBt->p
2ff30 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20  ageSize/4 );.   
2ff40 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
2ff50 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
2ff60 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
2ff70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
2ff80 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
2ff90 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
2ffa0 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
2ffb0 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
2ffc0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2ffd0 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
2ffe0 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
2fff0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
30000 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
30010 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
30020 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
30030 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
30040 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
30050 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
30060 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30070 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
30080 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
30090 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
300a0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
300b0 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
300c0 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
300d0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
300e0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
300f0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
30100 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
30110 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
30120 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
30130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
30140 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
30150 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
30160 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
30170 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
30180 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
30190 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
301a0 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
301b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
301c0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
301d0 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
301e0 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
301f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
30200 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
30210 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
30220 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
30230 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
30240 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
30250 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
30260 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
30270 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
30280 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
30290 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
302a0 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
302b0 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
302c0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
302d0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
302e0 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
302f0 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
30300 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
30310 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
30320 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
30330 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
30340 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
30350 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
30360 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
30370 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
30380 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
30390 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
303a0 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
303b0 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
303c0 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
303d0 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
303e0 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
303f0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
30400 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
30410 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
30420 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
30430 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
30440 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
30450 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
30460 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
30470 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
30480 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
30490 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
304a0 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
304b0 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
304c0 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
304d0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
304e0 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
304f0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
30500 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
30510 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
30520 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
30530 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
30540 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
30550 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
30560 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
30570 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
30580 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
30590 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
305a0 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
305b0 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
305c0 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
305d0 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
305e0 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
305f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f  LITE_CORRUPT; go
30600 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
30610 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  up; }.    }.  }.
30620 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
30630 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
30640 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
30650 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
30660 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
30670 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
30680 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
30690 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
306a0 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
306b0 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
306c0 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
306d0 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
306e0 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
306f0 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
30700 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
30710 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
30720 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
30730 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
30740 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
30750 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
30760 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
30770 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
30780 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
30790 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
307a0 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
307b0 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
307c0 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
307d0 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
307e0 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
307f0 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
30800 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
30810 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
30820 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
30830 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
30840 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
30850 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
30860 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
30870 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
30880 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
30890 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
308a0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
308b0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
308c0 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
308d0 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
308e0 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
308f0 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
30900 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
30910 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
30920 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
30930 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
30940 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
30950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30960 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
30970 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
30980 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
30990 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
309a0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
309b0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
309c0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
309d0 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
309e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
309f0 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
30a00 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
30a10 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
30a20 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
30a30 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
30a40 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
30a50 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
30a60 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
30a70 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
30a80 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
30a90 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
30aa0 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
30ab0 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
30ac0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
30ad0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
30ae0 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
30af0 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
30b00 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
30b10 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
30b20 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
30b30 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
30b40 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20  ) or pPage is.  
30b50 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  ** a virtual roo
30b60 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75  t page.  A virtu
30b70 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
30b80 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f  when the real ro
30b90 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20  ot.  ** page is 
30ba0 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72  page 1 and we ar
30bb0 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  e the only child
30bc0 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20   of that page.. 
30bd0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e   */.  assert( cn
30be0 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
30bf0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
30c00 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
30c10 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45  ==0) );..  TRACE
30c20 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
30c30 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
30c40 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
30c50 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
30c60 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
30c70 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
30c80 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
30c90 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
30ca0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
30cb0 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
30cc0 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
30cd0 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
30ce0 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
30cf0 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
30d00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30d10 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  RRUPT;.    goto 
30d20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
30d30 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
30d40 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
30d50 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
30d60 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
30d70 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
30d80 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
30d90 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
30da0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
30db0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
30dc0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
30dd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30de0 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
30df0 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
30e00 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
30e10 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
30e20 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
30e30 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
30e40 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
30e50 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
30e60 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
30e70 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29   &pgno, pgno, 0)
30e80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
30e90 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
30ea0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e  eanup;.      apN
30eb0 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20  ew[i] = pNew;.  
30ec0 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20      nNew++;..   
30ed0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f     /* Set the po
30ee0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
30ef0 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c  for the new sibl
30f00 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
30f10 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
30f20 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70  UUM ){.        p
30f30 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e  trmapPut(pBt, pN
30f40 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ew->pgno, PTRMAP
30f50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
30f60 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
30f70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30f90 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
30fa0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
30fb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30fc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  }.  }..  /* Free
30fd0 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
30fe0 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
30ff0 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
31000 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
31010 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72  i<nOld ){.    fr
31020 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c  eePage(apOld[i],
31030 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
31040 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
31050 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
31060 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
31070 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
31080 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
31090 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
310a0 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
310b0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
310c0 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
310d0 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
310e0 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
310f0 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
31100 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
31110 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
31120 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
31130 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
31140 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
31150 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
31160 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
31170 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
31180 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
31190 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
311a0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
311b0 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
311c0 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
311d0 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
311e0 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
311f0 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
31200 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
31210 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
31220 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
31230 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
31240 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
31250 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
31260 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
31270 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
31280 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
31290 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
312a0 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
312b0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
312c0 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
312d0 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e    int minV = apN
312e0 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[i]->pgno;.   
312f0 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20   int minI = i;. 
31300 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
31310 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  k; j++){.      i
31320 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e  f( apNew[j]->pgn
31330 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  o<(unsigned)minV
31340 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
31350 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
31360 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70  nV = apNew[j]->p
31370 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
31380 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
31390 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
313a0 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
313b0 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61  *pT;.      t = a
313c0 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
313d0 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
313e0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  i];.      apNew[
313f0 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
31400 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
31410 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
31420 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65    }.  TRACE(("ne
31430 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
31440 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
31450 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70  d(%d)\n",.    ap
31460 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a  New[0]->pgno, sz
31470 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77  New[0],.    nNew
31480 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e  >=2 ? apNew[1]->
31490 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
314a0 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
314b0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
314c0 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apNew[2]->pgno :
314d0 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
314e0 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
314f0 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b  nNew>=4 ? apNew[
31500 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  3]->pgno : 0, nN
31510 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
31520 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
31530 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67  5 ? apNew[4]->pg
31540 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20  no : 0, nNew>=5 
31550 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29  ? szNew[4] : 0))
31560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
31570 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31580 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
31590 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34  bPage) );.  put4
315a0 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e  byte(pRight, apN
315b0 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f  ew[nNew-1]->pgno
315c0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
315d0 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
315e0 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
315f0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
31600 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
31610 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
31620 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
31630 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
31640 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
31650 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
31660 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
31670 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
31680 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
31690 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
316a0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
316b0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
316c0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72  Cells );.    zer
316d0 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65  oPage(pNew, page
316e0 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65  Flags);.    asse
316f0 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63  mblePage(pNew, c
31700 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43  ntNew[i]-j, &apC
31710 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b  ell[j], &szCell[
31720 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  j]);.    assert(
31730 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c   pNew->nCell>0 |
31740 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e  | (nNew==1 && cn
31750 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20  tNew[0]==0) );. 
31760 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
31770 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
31780 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77  ..    j = cntNew
31790 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  [i];..    /* If 
317a0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
317b0 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
317c0 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67   was not the rig
317d0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c  ht-most sibling,
317e0 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61  .    ** insert a
317f0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
31800 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
31810 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ge..    */.    a
31820 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20  ssert( i<nNew-1 
31830 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  || j==nCell );. 
31840 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29     if( j<nCell )
31850 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
31860 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
31870 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
31880 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
31890 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
318a0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
318b0 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
318c0 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
318d0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
318e0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
318f0 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53  OvflSpace[iOvflS
31900 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28  pace];.      if(
31910 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a   !pNew->leaf ){.
31920 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
31930 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pNew->aData[8], 
31940 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20  pCell, 4);.     
31950 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
31960 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
31970 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
31980 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
31990 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
319a0 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
319b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
319c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
319d0 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
319e0 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
319f0 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
31a00 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
31a10 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
31a20 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
31a30 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
31a40 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
31a50 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
31a60 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
31a70 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
31a80 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
31a90 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
31aa0 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74   j--;.        bt
31ab0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
31ac0 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c  pNew, apCell[j],
31ad0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
31ae0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
31af0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b          sz = 4 +
31b00 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
31b10 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29  l[4], info.nKey)
31b20 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
31b30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
31b40 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
31b50 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a  -= 4;.        /*
31b60 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f   Obscure case fo
31b70 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20  r non-leaf-data 
31b80 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65  trees: If the ce
31b90 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a  ll at pCell was.
31ba0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
31bb0 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20  ously stored on 
31bc0 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64  a leaf node, and
31bd0 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69   its reported si
31be0 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20  ze was 4.       
31bf0 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20   ** bytes, then 
31c00 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  it may actually 
31c10 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
31c20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  this .        **
31c30 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65   (see btreeParse
31c40 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
31c50 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
31c60 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
31c70 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
31c80 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74  But it is import
31c90 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20  ant to pass the 
31ca0 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20  correct size to 
31cb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65  .        ** inse
31cc0 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70  rtCell(), so rep
31cd0 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f  arse the cell no
31ce0 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  w..        **.  
31cf0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
31d00 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65  at this can neve
31d10 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53  r happen in an S
31d20 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c  QLite data file,
31d30 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20   as all.        
31d40 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20  ** cells are at 
31d50 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49  least 4 bytes. I
31d60 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  t only happens i
31d70 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20  n b-trees used. 
31d80 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61         ** to eva
31d90 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43  luate "IN (SELEC
31da0 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69  T ...)" and simi
31db0 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20  lar clauses..   
31dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31dd0 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34  if( szCell[j]==4
31de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
31df0 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74  sert(leafCorrect
31e00 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20  ion==4);.       
31e10 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
31e20 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65  Ptr(pParent, pCe
31e30 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
31e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76       }.      iOv
31e50 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20  flSpace += sz;. 
31e60 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
31e70 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
31e80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31e90 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42  ( iOvflSpace<=pB
31ea0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
31eb0 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28       insertCell(
31ec0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
31ed0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
31ee0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
31ef0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
31f00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
31f10 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
31f20 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
31f30 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
31f40 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
31f50 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
31f60 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
31f70 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a   nxDiv++;.    }.
31f80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d    }.  assert( j=
31f90 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  =nCell );.  asse
31fa0 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20  rt( nOld>0 );.  
31fb0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29  assert( nNew>0 )
31fc0 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61  ;.  if( (pageFla
31fd0 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d  gs & PTF_LEAF)==
31fe0 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68  0 ){.    u8 *zCh
31ff0 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f  ild = &apCopy[nO
32000 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b  ld-1]->aData[8];
32010 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e  .    memcpy(&apN
32020 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74  ew[nNew-1]->aDat
32030 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29  a[8], zChild, 4)
32040 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
32050 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  oot && pParent->
32060 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72  nCell==0 && pPar
32070 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d  ent->hdrOffset<=
32080 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
32090 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  ){.    /* The ro
320a0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
320b0 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -tree now contai
320c0 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65  ns no cells. The
320d0 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20   only sibling.  
320e0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65    ** page is the
320f0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
32100 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79  the parent. Copy
32110 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32120 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c   the.    ** chil
32130 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  d page into the 
32140 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69  parent, decreasi
32150 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68  ng the overall h
32160 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20  eight of the.   
32170 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63   ** b-tree struc
32180 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69  ture by one. Thi
32190 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61  s is described a
321a0 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73  s the "balance-s
321b0 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a  hallower".    **
321c0 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69   sub-algorithm i
321d0 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61  n some documenta
321e0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tion..    **.   
321f0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
32200 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
32210 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c  tabase, the call
32220 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74   to copyNodeCont
32230 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65  ent() .    ** se
32240 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  ts all pointer-m
32250 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
32260 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61  sponding to data
32270 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73  base image pages
32280 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69   .    ** for whi
32290 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ch the pointer i
322a0 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  s stored within 
322b0 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  the content bein
322c0 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a  g copied..    **
322d0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
322e0 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20  nd assert below 
322f0 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
32300 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20  e child page is 
32310 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20  defragmented.   
32320 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c   ** (it must be,
32330 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20   as it was just 
32340 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73  reconstructed us
32350 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65  ing assemblePage
32360 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a  ()). This.    **
32370 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66   is important if
32380 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
32390 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70   happens to be p
323a0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
323b0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61  abase.    ** ima
323c0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ge.  */.    asse
323d0 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20  rt( nNew==1 );. 
323e0 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77     assert( apNew
323f0 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20  [0]->nFree == . 
32400 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65         (get2byte
32410 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74  (&apNew[0]->aDat
32420 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e  a[5])-apNew[0]->
32430 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77  cellOffset-apNew
32440 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20  [0]->nCell*2) . 
32450 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f     );.    copyNo
32460 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b  deContent(apNew[
32470 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63  0], pParent, &rc
32480 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  );.    freePage(
32490 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a  apNew[0], &rc);.
324a0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
324b0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
324c0 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
324d0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
324e0 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
324f0 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
32500 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
32510 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
32520 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
32530 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
32540 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
32550 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
32560 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
32570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
32580 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
32590 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
325a0 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
325b0 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
325c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
325d0 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
325e0 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
325f0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
32600 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
32610 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
32620 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
32630 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
32640 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
32650 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
32660 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
32670 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
32680 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
32690 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
326a0 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
326b0 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
326c0 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
326d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
326e0 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
326f0 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
32700 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
32710 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
32720 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
32730 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
32740 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
32750 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
32760 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
32770 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
32780 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
32790 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
327a0 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
327b0 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
327c0 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
327d0 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
327e0 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
327f0 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
32800 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
32810 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
32820 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
32830 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
32840 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
32850 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
32860 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
32870 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
32880 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
32890 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
328a0 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
328b0 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
328c0 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
328d0 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
328e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
328f0 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
32900 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
32910 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
32920 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
32930 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
32940 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
32950 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
32960 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
32970 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
32980 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
32990 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
329a0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
329b0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
329c0 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
329d0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
329e0 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
329f0 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
32a00 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
32a10 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
32a20 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
32a30 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
32a40 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
32a50 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
32a60 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
32a70 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
32a80 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
32a90 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
32aa0 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
32ab0 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
32ac0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
32ad0 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
32ae0 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
32af0 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
32b00 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
32b10 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
32b20 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
32b30 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
32b40 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
32b50 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
32b60 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
32b70 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
32b80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
32b90 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
32ba0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
32bb0 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
32bc0 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
32bd0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32be0 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
32bf0 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
32c00 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
32c10 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
32c20 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
32c30 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
32c40 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
32c50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c70 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
32c80 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
32c90 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cb0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
32cc0 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
32cd0 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
32ce0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
32cf0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73  +){.      int is
32d00 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20  Divider = 0;.   
32d10 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65     while( i==iNe
32d20 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20  xtOld ){.       
32d30 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
32d40 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
32d50 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
32d60 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c   last cell on ol
32d70 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  d.        ** sib
32d80 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20  ling page j. If 
32d90 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
32da0 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
32db0 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
32dc0 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
32dd0 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20  then cell i was 
32de0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
32df0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20  */.        pOld 
32e00 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20  = apCopy[++j];. 
32e10 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20         iNextOld 
32e20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20  = i + !leafData 
32e30 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20  + pOld->nCell + 
32e40 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c  .        if( pOl
32e60 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  d->nOverflow ){.
32e70 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66            nOverf
32e80 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
32e90 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20  rflow;.         
32ea0 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b   iOverflow = i +
32eb0 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c   !leafData + pOl
32ec0 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b  d->aOvfl[0].idx;
32ed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ee0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
32ef0 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
32f00 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
32f10 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
32f20 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
32f30 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
32f40 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
32f50 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
32f60 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
32f70 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73  dx-1);.      ass
32f80 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20  ert(nOverflow<3 
32f90 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  || pOld->aOvfl[1
32fa0 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
32fb0 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[2].idx-1);.  
32fc0 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72      if( i==iOver
32fd0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
32fe0 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20  isDivider = 1;. 
32ff0 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f         if( (--nO
33000 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20  verflow)>0 ){.  
33010 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
33020 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w++;.        }. 
33030 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
33040 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29  ( i==cntNew[k] )
33050 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  {.        /* Cel
33060 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20  l i is the cell 
33070 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
33080 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63  owing the last c
33090 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20  ell on new.     
330a0 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61     ** sibling pa
330b0 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62  ge k. If the sib
330c0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
330d0 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20  af pages of an. 
330e0 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79         ** intkey
330f0 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65   b-tree, then ce
33100 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65  ll i is a divide
33110 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20  r cell.  */.    
33120 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
33130 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++k];.        i
33140 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63  f( !leafData ) c
33150 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
33160 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
33170 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61  <nOld );.      a
33180 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b  ssert( k<nNew );
33190 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
331a0 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69  e cell was origi
331b0 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65  nally divider ce
331c0 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e  ll (and is not n
331d0 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ow) or.      ** 
331e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
331f0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c  , or if the cell
33200 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20   was located on 
33210 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c  a different sibl
33220 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ing.      ** pag
33230 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c  e before the bal
33240 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  ancing, then the
33250 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
33260 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ries associated.
33270 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
33280 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  y child or overf
33290 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74  low pages need t
332a0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a  o be updated.  *
332b0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
332c0 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70  vider || pOld->p
332d0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
332e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
332f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
33300 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d  {.          ptrm
33310 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
33320 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20  yte(apCell[i]), 
33330 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
33340 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
33350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33360 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e    if( szCell[i]>
33370 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
33380 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d  {.          ptrm
33390 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
333a0 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72  w, apCell[i], &r
333b0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
333c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
333d0 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63   if( !leafCorrec
333e0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  tion ){.      fo
333f0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
33400 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  ++){.        u32
33410 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65 28   key = get4byte(
33420 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61  &apNew[i]->aData
33430 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  [8]);.        pt
33440 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79  rmapPut(pBt, key
33450 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33460 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20  apNew[i]->pgno, 
33470 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
33480 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f    }..#if 0.    /
33490 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63  * The ptrmapChec
334a0 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e  kPages() contain
334b0 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  s assert() state
334c0 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66  ments that verif
334d0 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c  y that.    ** al
334e0 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  l pointer map pa
334f0 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72  ges are set corr
33500 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68  ectly. This is h
33510 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20  elpful while .  
33520 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20    ** debugging. 
33530 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20  This is usually 
33540 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65  disabled because
33550 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
33560 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63  ase may.    ** c
33570 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29  ause an assert()
33580 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61   statement to fa
33590 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d  il.  */.    ptrm
335a0 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e  apCheckPages(apN
335b0 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70  ew, nNew);.    p
335c0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
335d0 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65  &pParent, 1);.#e
335e0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ndif.  }..  asse
335f0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49  rt( pParent->isI
33600 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28  nit );.  TRACE((
33610 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
33620 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  ed: old=%d new=%
33630 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
33640 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e           nOld, n
33650 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20  New, nCell));.. 
33660 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
33670 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
33680 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
33690 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
336a0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
336b0 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
336c0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
336d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
336e0 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
336f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
33700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
33710 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
33720 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
33730 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
33740 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33750 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
33760 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
33770 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
33780 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28  is.** overfull (
33790 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  has one or more 
337a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
337b0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69  .**.** A new chi
337c0 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ld page is alloc
337d0 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e  ated and the con
337e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72  tents of the cur
337f0 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  rent root.** pag
33800 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65  e, including ove
33810 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65  rflow cells, are
33820 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
33830 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74   child. The root
33840 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e  .** page is then
33850 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20   overwritten to 
33860 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79  make it an empty
33870 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72   page with the r
33880 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70  ight-child .** p
33890 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20  ointer pointing 
338a0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
338b0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
338c0 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69  turning, all poi
338d0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
338e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
338f0 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74  o pages .** that
33900 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70   the new child-p
33910 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73  age now contains
33920 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65   pointers to are
33930 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a   updated. The.**
33940 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e   entry correspon
33950 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20  ding to the new 
33960 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
33970 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a  ter of the root.
33980 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  ** page is also 
33990 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  updated..**.** I
339a0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
339b0 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
339c0 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72   contain a refer
339d0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c  ence to the chil
339e0 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53  d .** page and S
339f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
33a00 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
33a10 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  se the caller is
33a20 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
33a30 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
33a40 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65  () on *ppChild e
33a50 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20  xactly once. If 
33a60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
33a70 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
33a80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
33a90 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  d *ppChild is se
33aa0 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  t to 0..*/.stati
33ab0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  c int balance_de
33ac0 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52  eper(MemPage *pR
33ad0 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70  oot, MemPage **p
33ae0 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72  pChild){.  int r
33af0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
33b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
33b10 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
33b20 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
33b30 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
33b40 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
33b50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
33b60 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
33b70 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
33b80 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
33b90 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33ba0 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
33bb0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
33bc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52  Shared *pBt = pR
33bd0 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  oot->pBt;    /* 
33be0 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20  The BTree */..  
33bf0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e  assert( pRoot->n
33c00 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20  Overflow>0 );.  
33c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33c20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
33c30 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
33c40 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20  Make pRoot, the 
33c50 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
33c60 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c   b-tree, writabl
33c70 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  e. Allocate a ne
33c80 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61  w .  ** page tha
33c90 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
33ca0 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
33cb0 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79  d of pPage. Copy
33cc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
33cd0 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73  ** of the node s
33ce0 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69  tored on pRoot i
33cf0 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c  nto the new chil
33d00 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72  d page..  */.  r
33d10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33d20 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
33d30 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
33d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33d50 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
33d60 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43  treePage(pBt,&pC
33d70 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c  hild,&pgnoChild,
33d80 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a  pRoot->pgno,0);.
33d90 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
33da0 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  ent(pRoot, pChil
33db0 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  d, &rc);.    if(
33dc0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
33dd0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
33de0 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c  (pBt, pgnoChild,
33df0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
33e00 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  Root->pgno, &rc)
33e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
33e20 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43  ( rc ){.    *ppC
33e30 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  hild = 0;.    re
33e40 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
33e50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
33e60 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
33e70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33e80 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e  iteable(pChild->
33e90 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
33ea0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
33eb0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52  erIswriteable(pR
33ec0 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  oot->pDbPage) );
33ed0 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
33ee0 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d  d->nCell==pRoot-
33ef0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41  >nCell );..  TRA
33f00 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f  CE(("BALANCE: co
33f10 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20  py root %d into 
33f20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67  %d\n", pRoot->pg
33f30 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  no, pChild->pgno
33f40 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74  ));..  /* Copy t
33f50 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
33f60 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20  s from pRoot to 
33f70 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63  pChild */.  memc
33f80 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
33f90 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20  , pRoot->aOvfl, 
33fa0 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
33fb0 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61  *sizeof(pRoot->a
33fc0 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68  Ovfl[0]));.  pCh
33fd0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ild->nOverflow =
33fe0 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
33ff0 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68  w;..  /* Zero th
34000 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52  e contents of pR
34010 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c  oot. Then instal
34020 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20  l pChild as the 
34030 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a  right-child. */.
34040 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74    zeroPage(pRoot
34050 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
34060 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b  0] & ~PTF_LEAF);
34070 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f  .  put4byte(&pRo
34080 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
34090 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
340a0 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70  gnoChild);..  *p
340b0 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b  pChild = pChild;
340c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
340d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
340e0 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72  e page that pCur
340f0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
34100 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65  s to has just be
34110 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a  en modified in.*
34120 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73  * some way. This
34130 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65   function figure
34140 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f  s out if this mo
34150 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73  dification means
34160 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65   the.** tree nee
34170 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65  ds to be balance
34180 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c  d, and if so cal
34190 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ls the appropria
341a0 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a  te balancing .**
341b0 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63   routine. Balanc
341c0 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
341d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  :.**.**   balanc
341e0 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62  e_quick().**   b
341f0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a  alance_deeper().
34200 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  **   balance_non
34210 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63  root().*/.static
34220 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
34230 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
34240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34250 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  OK;.  const int 
34260 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74  nMin = pCur->pBt
34270 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32  ->usableSize * 2
34280 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61   / 3;.  u8 aBala
34290 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33  nceQuickSpace[13
342a0 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  ];.  u8 *pFree =
342b0 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28   0;..  TESTONLY(
342c0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
342d0 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  ck_called = 0 );
342e0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
342f0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f   balance_deeper_
34300 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20  called = 0 );.. 
34310 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50   do {.    int iP
34320 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
34330 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
34340 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
34350 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20  Page[iPage];..  
34360 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
34370 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
34380 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
34390 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
343a0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
343b0 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75  b-tree is overfu
343c0 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
343d0 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20   call the.      
343e0 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65    ** balance_dee
343f0 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  per() function t
34400 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63  o create a new c
34410 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  hild for the roo
34420 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
34430 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63  * and copy the c
34440 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
34450 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
34460 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20   to it. The.    
34470 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72      ** next iter
34480 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
34490 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
344a0 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  e the child page
344b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20  ..        */ .  
344c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
344d0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
344e0 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
344f0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
34500 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c  ce_deeper(pPage,
34510 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31   &pCur->apPage[1
34520 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
34530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34540 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
34550 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20  >iPage = 1;.    
34560 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
34570 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[0] = 0;.      
34580 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
34590 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
345a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
345b0 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72  apPage[1]->nOver
345c0 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20  flow );.        
345d0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
345e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
345f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
34600 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
34610 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
34620 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b  ->nFree<=nMin ){
34630 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
34640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d    }else{.      M
34650 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70  emPage * const p
34660 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
34670 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a  pPage[iPage-1];.
34680 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20        int const 
34690 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  iIdx = pCur->aiI
346a0 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20  dx[iPage-1];..  
346b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
346c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65  PagerWrite(pPare
346d0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
346e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
346f0 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66  TE_OK ){.#ifndef
34700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
34710 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20  CKBALANCE.      
34720 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
34730 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26 26  Data.         &&
34740 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
34750 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  w==1.         &&
34760 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
34770 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  .idx==pPage->nCe
34780 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ll.         && p
34790 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a  Parent->pgno!=1.
347a0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
347b0 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78  ent->nCell==iIdx
347c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
347d0 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61        /* Call ba
347e0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f  lance_quick() to
347f0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73 69   create a new si
34800 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f  bling of pPage o
34810 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20  n which.        
34820 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68    ** to store th
34830 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
34840 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
34850 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63   inserts a new c
34860 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ell.          **
34870 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77   into pParent, w
34880 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70  hich may cause p
34890 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e  Parent overflow.
348a0 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   If this.       
348b0 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
348c0 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69  he next interati
348d0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
348e0 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70  p will balance p
348f0 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20  Parent .        
34900 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20    ** use either 
34910 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34920 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65  ) or balance_dee
34930 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69  per(). Until thi
34940 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  s.          ** h
34950 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72  appens, the over
34960 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f  flow cell is sto
34970 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61  red in the aBala
34980 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a  nceQuickSpace[].
34990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
349a0 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20  fer. .          
349b0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
349c0 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  The purpose of t
349d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
349e0 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65 63  ert() is to chec
349f0 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20  k that only a.  
34a00 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
34a10 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  e call to balanc
34a20 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64  e_quick() is mad
34a30 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20  e for each call 
34a40 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  to this.        
34a50 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49    ** function. I
34a60 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20  f this were not 
34a70 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62 74  verified, a subt
34a80 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67  le bug involving
34a90 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20 20   reuse.         
34aa0 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61   ** of the aBala
34ab0 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20  nceQuickSpace[] 
34ac0 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a  might sneak in..
34ad0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
34ae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
34af0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61  balance_quick_ca
34b00 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20  lled++)==0 );.  
34b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
34b20 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65  ance_quick(pPare
34b30 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61  nt, pPage, aBala
34b40 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a  nceQuickSpace);.
34b50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
34b60 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
34b70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74           /* In t
34b80 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62  his case, call b
34b90 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34ba0 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65   to redistribute
34bb0 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
34bc0 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67   ** between pPag
34bd0 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66  e and up to 2 of
34be0 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67   its sibling pag
34bf0 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  es. This involve
34c00 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d  s.          ** m
34c10 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
34c20 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74  tents of pParent
34c30 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
34c40 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20  e pParent to.   
34c50 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65         ** become
34c60 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
34c70 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74  erfull. The next
34c80 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34c90 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20  e do-loop.      
34ca0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61      ** will bala
34cb0 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  nce the parent p
34cc0 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74  age to correct t
34cd0 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  his..          *
34ce0 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  * .          ** 
34cf0 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  If the parent pa
34d00 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66  ge becomes overf
34d10 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f  ull, the overflo
34d20 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a  w cell or cells.
34d30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65            ** are
34d40 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70   stored in the p
34d50 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c  Space buffer all
34d60 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65  ocated immediate
34d70 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20  ly below. .     
34d80 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71       ** A subseq
34d90 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  uent iteration o
34da0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
34db0 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68 69  ll deal with thi
34dc0 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  s by.          *
34dd0 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63  * calling balanc
34de0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c  e_nonroot() (bal
34df0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61  ance_deeper() ma
34e00 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  y be called firs
34e10 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t,.          ** 
34e20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64  but it doesn't d
34e30 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  eal with overflo
34e40 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d  w cells - just m
34e50 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20  oves them to a. 
34e60 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66           ** diff
34e70 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63  erent page). Onc
34e80 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65 6e  e this subsequen
34e90 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  t call to balanc
34ea0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20  e_nonroot() .   
34eb0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f         ** has co
34ec0 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73  mpleted, it is s
34ed0 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74  afe to release t
34ee0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
34ef0 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20 20   used by.       
34f00 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f     ** the previo
34f10 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20  us call, as the 
34f20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61  overflow cell da
34f30 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ta will have bee
34f40 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n .          ** 
34f50 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69 6e  copied either in
34f60 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  to the body of a
34f70 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6f   database page o
34f80 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  r into the new. 
34f90 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61           ** pSpa
34fa0 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ce buffer passed
34fb0 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63   to the latter c
34fc0 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
34fd0 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20  onroot()..      
34fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
34ff0 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71   u8 *pSpace = sq
35000 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
35010 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53  pCur->pBt->pageS
35020 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
35030 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
35040 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49  root(pParent, iI
35050 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67  dx, pSpace, iPag
35060 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  e==1);.         
35070 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
35080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
35090 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pFree is not NUL
350a0 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  L, it points to 
350b0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
350c0 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  r used .        
350d0 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76      ** by a prev
350e0 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ious call to bal
350f0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20  ance_nonroot(). 
35100 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  Its contents are
35110 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
35120 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68 65  now stored eithe
35130 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61  r on real databa
35140 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74 68  se pages or with
35150 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
35160 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63      ** new pSpac
35170 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20  e buffer, so it 
35180 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66 72  may be safely fr
35190 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  eed here. */.   
351a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
351b0 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
351c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
351d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
351e0 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69 6c  Space buffer wil
351f0 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65 72  l be freed after
35200 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
35210 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
35220 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
35230 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65  , or just before
35240 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
35250 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65  eturns, whicheve
35260 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
35270 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20  omes first. */. 
35280 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d           pFree =
35290 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20   pSpace;.       
352a0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
352b0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
352c0 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ow = 0;..      /
352d0 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  * The next itera
352e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
352f0 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65  oop balances the
35300 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f   parent page. */
35310 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
35320 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
35330 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
35340 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
35350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
35360 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ..  if( pFree ){
35370 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
35380 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d  Free(pFree);.  }
35390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
353a0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
353b0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
353c0 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
353d0 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
353e0 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
353f0 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
35400 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
35410 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
35420 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
35430 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
35440 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
35450 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
35460 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
35470 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
35480 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
35490 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
354a0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
354b0 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
354c0 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
354d0 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
354e0 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
354f0 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
35500 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
35510 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
35520 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
35530 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
35540 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
35550 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
35560 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75  -zero, then a su
35570 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f  ccessful call to
35580 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  .** MovetoUnpack
35590 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72  ed() to seek cur
355a0 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65  sor pCur to (pKe
355b0 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72  y, nKey) has alr
355c0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72  eady.** been per
355d0 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75  formed. seekResu
355e0 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68  lt is the search
355f0 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64   result returned
35600 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20   (a negative.** 
35610 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70  number if pCur p
35620 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72  oints at an entr
35630 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65  y that is smalle
35640 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b  r than (pKey, nK
35650 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73  ey), or.** a pos
35660 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70  itive value if p
35670 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
35680 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61   etry that is la
35690 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70  rger than .** (p
356a0 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a  Key, nKey)). .**
356b0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
356c0 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
356d0 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f  is 0, then curso
356e0 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e 74  r pCur may point
356f0 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74 72   to any .** entr
35700 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79  y or to no entry
35710 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69 73   at all. In this
35720 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
35730 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a  ion has to seek.
35740 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  ** the cursor be
35750 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79  fore the new key
35760 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64   can be inserted
35770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35780 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
35790 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
357a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
357b0 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
357c0 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
357d0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
357e0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
357f0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
35800 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
35810 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
35820 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
35830 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  ta, int nData,  
35840 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
35850 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
35860 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
35870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35880 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
35890 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20  xtra 0 bytes to 
358a0 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
358b0 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69  /.  int appendBi
358c0 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  as,             
358d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
358e0 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20  is is likely an 
358f0 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
35900 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20  seekResult      
35910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35920 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f  sult of prior Mo
35930 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 63  vetoUnpacked() c
35940 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
35950 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
35960 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e  seekResult;.  in
35970 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
35980 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
35990 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
359a0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
359b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
359c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
359d0 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
359e0 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
359f0 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
35a00 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  0;..  if( pCur->
35a10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
35a20 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65  AULT ){.    asse
35a30 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
35a40 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
35a50 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
35a60 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
35a70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
35a80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
35a90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35aa0 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
35ab0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
35ac0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
35ad0 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
35ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61   );.  assert( ha
35af0 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
35b00 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70  eLock(p, pCur->p
35b10 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70  gnoRoot, pCur->p
35b20 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29  KeyInfo!=0, 2) )
35b30 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
35b40 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
35b50 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73 74 65  as been consiste
35b60 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75 72 73  nt. If this curs
35b70 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a 20 20  or was opened.  
35b80 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61 6e 20  ** expecting an 
35b90 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 74 68  index b-tree, th
35ba0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  en the caller sh
35bb0 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69 6e  ould be insertin
35bc0 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79 73  g blob.  ** keys
35bd0 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63 69 61   with no associa
35be0 74 65 64 20 64 61 74 61 2e 20 49 66 20 74 68 65  ted data. If the
35bf0 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
35c00 65 64 20 65 78 70 65 63 74 69 6e 67 20 61 6e 0a  ed expecting an.
35c10 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62 6c    ** intkey tabl
35c20 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  e, the caller sh
35c30 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69 6e  ould be insertin
35c40 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 77  g integer keys w
35c50 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62 20  ith a.  ** blob 
35c60 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  of associated da
35c70 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ta.  */.  assert
35c80 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  ( (pKey==0)==(pC
35c90 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
35ca0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
35cb0 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20 69  s is an insert i
35cc0 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72  nto a table b-tr
35cd0 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ee, invalidate a
35ce0 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20 2a  ny incrblob .  *
35cf0 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
35d00 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
35d10 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d 69  replaced (assumi
35d20 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65 70  ng this is a rep
35d30 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  lace.  ** operat
35d40 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20 6e  ion - if it is n
35d50 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot, the followin
35d60 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20 20  g is a no-op).  
35d70 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
35d80 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
35d90 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
35da0 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 6e  blobCursors(p, n
35db0 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
35dc0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
35dd0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
35de0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
35df0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20  on this table.. 
35e00 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65   **.  ** In some
35e10 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
35e20 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f 28   to btreeMoveto(
35e30 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f 2d  ) below is a no-
35e40 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78 61  op. For.  ** exa
35e50 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65 72  mple, when inser
35e60 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20 61  ting data into a
35e70 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74 6f   table with auto
35e80 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65 67  -generated integ
35e90 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74 68  er.  ** keys, th
35ea0 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e 76  e VDBE layer inv
35eb0 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72 65  okes sqlite3Btre
35ec0 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75 72  eLast() to figur
35ed0 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a 20  e out the .  ** 
35ee0 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20 75  integer key to u
35ef0 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  se. It then call
35f00 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
35f10 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73 65  to actually inse
35f20 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  rt the .  ** dat
35f30 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b 65  a into the intke
35f40 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68 69  y B-Tree. In thi
35f50 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76 65  s case btreeMove
35f60 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a  to() recognizes.
35f70 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75    ** that the cu
35f80 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
35f90 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20 74  where it needs t
35fa0 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73  o be and returns
35fb0 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f   without.  ** do
35fc0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f  ing any work. To
35fd0 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67   avoid thwarting
35fe0 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
35ff0 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f  ions, it is impo
36000 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74  rtant.  ** not t
36010 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72 73  o clear the curs
36020 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  or here..  */.  
36030 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
36040 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
36050 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a  gnoRoot, pCur);.
36060 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
36070 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f 63  n rc;.  if( !loc
36080 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
36090 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
360a0 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e  Key, nKey, appen
360b0 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20 20  dBias, &loc);.  
360c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
360d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
360e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
360f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
36100 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  | (pCur->eState=
36110 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
36120 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50  && loc) );..  pP
36130 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
36140 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
36150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36160 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
36170 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
36180 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
36190 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
361a0 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  ;..  TRACE(("INS
361b0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
361c0 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
361d0 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
361e0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
361f0 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
36200 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
36210 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
36220 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
36230 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
36240 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
36250 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
36260 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
36270 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65  ce(pBt);.  newCe
36280 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
36290 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65  ace;.  if( newCe
362a0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
362b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
362c0 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
362d0 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70  Page, newCell, p
362e0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61  Key, nKey, pData
362f0 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20  , nData, nZero, 
36300 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
36310 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
36320 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
36330 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
36340 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
36350 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
36360 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
36370 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78  ZE(pBt) );.  idx
36380 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
36390 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
363a0 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  f( loc==0 ){.   
363b0 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
363c0 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67  assert( idx<pPag
363d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
363e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
363f0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
36400 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
36410 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
36420 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
36430 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
36440 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
36450 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21   idx);.    if( !
36460 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
36470 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
36480 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
36490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
364a0 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
364b0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
364c0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
364d0 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
364e0 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  ll);.    dropCel
364f0 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a  l(pPage, idx, sz
36500 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  Old, &rc);.    i
36510 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
36520 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  _insert;.  }else
36530 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
36540 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
36550 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36560 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
36570 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
36580 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
36590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
365a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
365b0 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65 72  f );.  }.  inser
365c0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  tCell(pPage, idx
365d0 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
365e0 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  , 0, 0, &rc);.  
365f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
36600 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d 3e  TE_OK || pPage->
36610 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67 65  nCell>0 || pPage
36620 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
36630 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72  ..  /* If no err
36640 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 61  or has occured a
36650 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e 20  nd pPage has an 
36660 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 63  overflow cell, c
36670 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a 20  all balance() . 
36680 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69 62   ** to redistrib
36690 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69  ute the cells wi
366a0 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20 53  thin the tree. S
366b0 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20 6d  ince balance() m
366c0 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  ay move.  ** the
366d0 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74 68   cursor, zero th
366e0 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 2e  e BtCursor.info.
366f0 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72 73  nSize and BtCurs
36700 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20 2a  or.validNKey.  *
36710 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  * variables..  *
36720 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20  *.  ** Previous 
36730 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
36740 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54 6f  te called moveTo
36750 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20 74  Root() to move t
36760 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 62  he cursor.  ** b
36770 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ack to the root 
36780 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65 28  page as balance(
36790 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c 69  ) used to invali
367a0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
367b0 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72 73  s.  ** of BtCurs
367c0 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  or.apPage[] and 
367d0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b 5d  BtCursor.aiIdx[]
367e0 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f 69  . Instead of doi
367f0 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73 65  ng that,.  ** se
36800 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
36810 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22 2e  te to "invalid".
36820 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d 6d   This makes comm
36830 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  on insert operat
36840 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ions.  ** slight
36850 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a 0a  ly faster..  **.
36860 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
36870 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f 72  subtle but impor
36880 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tant optimizatio
36890 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e  n here too. When
368a0 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20   inserting.  ** 
368b0 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64 73  multiple records
368c0 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20   into an intkey 
368d0 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20 73  b-tree using a s
368e0 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61 73  ingle cursor (as
368f0 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e   can.  ** happen
36900 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
36910 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54  g an "INSERT INT
36920 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73 74  O ... SELECT" st
36930 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a  atement), it.  *
36940 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f 75  * is advantageou
36950 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  s to leave the c
36960 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
36970 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
36980 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74   in.  ** the b-t
36990 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ree if possible.
369a0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
369b0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
369c0 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  to the last.  **
369d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
369e0 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65 78  ble, and the nex
369f0 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20 68  t row inserted h
36a00 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65  as an integer ke
36a10 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68  y.  ** larger th
36a20 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  an the largest e
36a30 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74 20  xisting key, it 
36a40 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69  is possible to i
36a50 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20 72  nsert the.  ** r
36a60 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b 69  ow without seeki
36a70 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20 54  ng the cursor. T
36a80 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69 67  his can be a big
36a90 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
36aa0 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  st..  */.  pCur-
36ab0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
36ac0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
36ad0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  ey = 0;.  if( rc
36ae0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
36af0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
36b00 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  ){.    rc = bala
36b10 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20 20  nce(pCur);..    
36b20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75 72  /* Must make sur
36b30 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 72  e nOverflow is r
36b40 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76 65  eset to zero eve
36b50 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63 65  n if the balance
36b60 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73 2e  ().    ** fails.
36b70 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   Internal data s
36b80 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
36b90 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ion will result 
36ba0 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20 20  otherwise. .    
36bb0 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68 65  ** Also, set the
36bc0 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f   cursor state to
36bd0 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20 73   invalid. This s
36be0 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72 50  tops saveCursorP
36bf0 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a 2a  osition().    **
36c00 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
36c10 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
36c20 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
36c30 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20 20   cursor.  */.   
36c40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
36c50 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
36c60 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70  rflow = 0;.    p
36c70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
36c80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
36c90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
36ca0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
36cb0 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Page]->nOverflow
36cc0 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65  ==0 );..end_inse
36cd0 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rt:.  return rc;
36ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
36cf0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
36d00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
36d10 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
36d20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
36d30 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
36d40 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69  arbitrary locati
36d50 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
36d60 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
36d70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
36d80 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
36d90 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
36da0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36db0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
36dc0 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20   .  int rc;     
36dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36de0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
36df0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
36e00 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 6c    /* Page to del
36e30 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f  ete cell from */
36e40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
36e50 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
36e60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
36e70 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65  er to cell to de
36e80 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  lete */.  int iC
36e90 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20 20  ellIdx;         
36ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36eb0 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
36ec0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
36ed0 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20 20  nt iCellDepth;  
36ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ef0 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20      /* Depth of 
36f00 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
36f10 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73 73  pCell */ ..  ass
36f20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
36f30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
36f40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
36f50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
36f60 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
36f70 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
36f80 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74  Only );.  assert
36f90 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
36fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  ;.  assert( hasS
36fb0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
36fc0 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  ock(p, pCur->pgn
36fd0 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65  oRoot, pCur->pKe
36fe0 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a  yInfo!=0, 2) );.
36ff0 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
37000 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70  adConflicts(p, p
37010 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20 29  Cur->pgnoRoot) )
37020 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
37030 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
37040 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61  >iPage]>=pCur->a
37050 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
37060 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20 7c  e]->nCell) .   |
37070 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  | NEVER(pCur->eS
37080 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
37090 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ID).  ){.    ret
370a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
370b0 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20  ;  /* Something 
370c0 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20 2a  has gone awry. *
370d0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  /.  }..  /* If t
370e0 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65 20  his is a delete 
370f0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65 6d  operation to rem
37100 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61  ove a row from a
37110 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a 20   table b-tree,. 
37120 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20 61   ** invalidate a
37130 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
37140 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
37150 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65  row being delete
37160 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  d.  */.  if( pCu
37170 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  r->pKeyInfo==0 )
37180 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
37190 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
371a0 70 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  p, pCur->info.nK
371b0 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  ey, 0);.  }..  i
371c0 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75 72  CellDepth = pCur
371d0 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c 6c  ->iPage;.  iCell
371e0 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  Idx = pCur->aiId
371f0 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  x[iCellDepth];. 
37200 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
37210 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68  pPage[iCellDepth
37220 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  ];.  pCell = fin
37230 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
37240 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  llIdx);..  /* If
37250 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
37260 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
37270 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20  o delete is not 
37280 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f 76  a leaf page, mov
37290 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
372a0 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  r to the largest
372b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
372c0 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ee that is small
372d0 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65  er than.  ** the
372e0 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65 6c   entry being del
372f0 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c 20  eted. This cell 
37300 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68 65  will replace the
37310 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37320 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ted.  ** from th
37330 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  e internal node.
37340 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27 20   The 'previous' 
37350 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66 6f  entry is used fo
37360 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a 20  r this instead. 
37370 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78 74   ** of the 'next
37380 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65 20  ' entry, as the 
37390 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
373a0 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74 20  s always a part 
373b0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 2d  of the.  ** sub-
373c0 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20 74  tree headed by t
373d0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  he child page of
373e0 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20   the cell being 
373f0 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d 61  deleted. This ma
37400 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  kes.  ** balanci
37410 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c 6c  ng the tree foll
37420 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65  owing the delete
37430 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69 65   operation easie
37440 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  r.  */.  if( !pP
37450 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
37460 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
37470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
37480 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
37490 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
374a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
374b0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
374c0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
374d0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
374e0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
374f0 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f 72 65  his table before
37500 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e 79  .  ** making any
37510 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e 20   modifications. 
37520 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20 63 6f  Make the page co
37530 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74  ntaining the ent
37540 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 64  ry to be .  ** d
37550 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c 65 2e  eleted writable.
37560 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79 20 6f   Then free any o
37570 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
37580 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
37590 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61 6e  e .  ** entry an
375a0 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76 65  d finally remove
375b0 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   the cell itself
375c0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
375d0 20 70 61 67 65 2e 20 20 0a 20 20 2a 2f 0a 20 20   page.  .  */.  
375e0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
375f0 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
37600 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b 0a  gnoRoot, pCur);.
37610 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37620 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
37630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37640 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
37650 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37660 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 63 6c 65  n rc;.  rc = cle
37670 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
37680 65 6c 6c 29 3b 0a 20 20 64 72 6f 70 43 65 6c 6c  ell);.  dropCell
37690 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78  (pPage, iCellIdx
376a0 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
376b0 61 67 65 2c 20 70 43 65 6c 6c 29 2c 20 26 72 63  age, pCell), &rc
376c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
376d0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49  turn rc;..  /* I
376e0 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74  f the cell delet
376f0 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74  ed was not locat
37700 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67  ed on a leaf pag
37710 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  e, then the curs
37720 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72 72 65  or.  ** is curre
37730 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
37740 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
37750 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d 74 72  ry in the sub-tr
37760 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a 20 62  ee headed.  ** b
37770 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61 67 65  y the child-page
37780 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
37790 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c 65 74  t was just delet
377a0 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72  ed from an inter
377b0 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54  nal.  ** node. T
377c0 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65  he cell from the
377d0 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65 64 73   leaf node needs
377e0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   to be moved to 
377f0 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a  the internal.  *
37800 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61 63  * node to replac
37810 65 20 74 68 65 20 64 65 6c 65 74 65 64 20 63 65  e the deleted ce
37820 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  ll.  */.  if( !p
37830 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
37840 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
37850 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
37860 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
37870 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
37880 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e   Pgno n = pCur->
37890 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
378a0 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  h+1]->pgno;.    
378b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
378c0 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20  Tmp;..    pCell 
378d0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66  = findCell(pLeaf
378e0 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31  , pLeaf->nCell-1
378f0 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63  );.    nCell = c
37900 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66  ellSizePtr(pLeaf
37910 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73  , pCell);.    as
37920 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49  sert( MX_CELL_SI
37930 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29  ZE(pBt)>=nCell )
37940 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ;..    allocateT
37950 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
37960 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70     pTmp = pBt->p
37970 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20 20 72  TmpSpace;..    r
37980 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37990 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70 44 62  Write(pLeaf->pDb
379a0 50 61 67 65 29 3b 0a 20 20 20 20 69 6e 73 65 72  Page);.    inser
379b0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  tCell(pPage, iCe
379c0 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20  llIdx, pCell-4, 
379d0 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e  nCell+4, pTmp, n
379e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 64 72 6f 70  , &rc);.    drop
379f0 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
37a00 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c  f->nCell-1, nCel
37a10 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  l, &rc);.    if(
37a20 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e  .  }..  /* Balan
37a40 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66 20  ce the tree. If 
37a50 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
37a60 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  d was located on
37a70 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20 20   a leaf page,.  
37a80 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  ** then the curs
37a90 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  or still points 
37aa0 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49 6e  to that page. In
37ab0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
37ac0 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74  irst.  ** call t
37ad0 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70 61  o balance() repa
37ae0 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61 6e  irs the tree, an
37af0 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f  d the if(...) co
37b00 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  ndition is.  ** 
37b10 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a  never true..  **
37b20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
37b30 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64 65   if the entry de
37b40 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e 20  leted was on an 
37b50 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61  internal node pa
37b60 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43  ge, then.  ** pC
37b70 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
37b80 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
37b90 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65 6c  from which a cel
37ba0 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74 6f  l was removed to
37bb0 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74 68  .  ** replace th
37bc0 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 66  e cell deleted f
37bd0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
37be0 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73   node. This is s
37bf0 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69  lightly.  ** tri
37c00 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66 20  cky as the leaf 
37c10 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64 65  node may be unde
37c20 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69  rfull, and the i
37c30 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79  nternal node may
37c40 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72 20  .  ** be either 
37c50 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75 6c  under or overful
37c60 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
37c70 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e  run the balancin
37c80 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a  g algorithm.  **
37c90 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   on the leaf nod
37ca0 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65 20  e first. If the 
37cb0 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73  balance proceeds
37cc0 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74   far enough up t
37cd0 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61  he.  ** tree tha
37ce0 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72 65  t we can be sure
37cf0 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65   that any proble
37d00 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  m in the interna
37d10 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20  l node has.  ** 
37d20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20  been corrected, 
37d30 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77  so be it. Otherw
37d40 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e  ise, after balan
37d50 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f  cing the leaf no
37d60 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68  de,.  ** walk th
37d70 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65 20  e cursor up the 
37d80 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74 65  tree to the inte
37d90 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61  rnal node and ba
37da0 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20 2a  lance it as .  *
37db0 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63  * well.  */.  rc
37dc0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
37dd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37de0 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69  TE_OK && pCur->i
37df0 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20  Page>iCellDepth 
37e00 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
37e10 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44  ur->iPage>iCellD
37e20 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72 65  epth ){.      re
37e30 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
37e40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
37e50 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
37e60 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
37e70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
37e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37e90 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
37ea0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
37eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37ec0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
37ed0 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
37ee0 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
37ef0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
37f00 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
37f10 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
37f20 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
37f30 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
37f40 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
37f50 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
37f60 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
37f70 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
37f80 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
37f90 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
37fa0 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
37fb0 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
37fc0 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
37fd0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
37fe0 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
37ff0 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
38000 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
38010 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
38020 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
38030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38040 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
38050 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63  ndices.*/.static
38060 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65   int btreeCreate
38070 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
38080 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
38090 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
380a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
380b0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
380c0 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
380d0 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
380e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
380f0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
38100 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
38110 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
38120 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
38130 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
38140 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
38150 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
38160 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
38170 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
38180 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
38190 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
381a0 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
381b0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
381c0 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
381d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
381e0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
381f0 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
38200 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
38210 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
38220 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
38230 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
38240 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
38250 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
38260 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
38270 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
38280 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
38290 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
382a0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
382b0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
382c0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
382d0 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
382e0 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
382f0 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
38300 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
38310 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
38320 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
38330 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
38340 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
38350 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
38360 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
38370 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
38380 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
38390 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
383a0 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
383b0 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
383c0 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
383d0 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
383e0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
383f0 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
38400 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
38410 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
38420 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
38430 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
38440 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
38450 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
38460 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
38470 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
38480 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52  eta(p, BTREE_LAR
38490 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20  GEST_ROOT_PAGE, 
384a0 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20  &pgnoRoot);.    
384b0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20  pgnoRoot++;..