/ Hex Artifact Content
Login

Artifact 873a82706e07604a638e02e12617983df8e8070a:


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 53   ){.        /* S
b900: 74 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f  tart of free blo
b910: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
b920: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
b930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b940: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
b950: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
b960: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
b970: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
b980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b990: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
b9a0: 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65  f( (next>0 && ne
b9b0: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c  xt<=pc+size+3) |
b9c0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b9d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
b9e0: 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d  /* Free blocks m
b9f0: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
ba00: 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74  ing order. And t
ba10: 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
ba20: 09 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f  .** the free-blo
ba30: 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74  ck must lie on t
ba40: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
ba50: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
ba60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ba70: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
ba80: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d   }.      nFree =
ba90: 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
baa0: 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
bab0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
bac0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72   this point, nFr
bad0: 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ee contains the 
bae0: 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65  sum of the offse
baf0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
bb00: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c     ** of the cel
bb10: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
bb20: 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
bb30: 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
bb40: 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  hin.    ** the c
bb50: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
bb60: 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
bb70: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
bb80: 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a  able-size.    **
bb90: 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68   of the page, th
bba0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74  en the page must
bbb0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54   be corrupted. T
bbc0: 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20  his check also. 
bbd0: 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20     ** serves to 
bbe0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
bbf0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bc00: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
bc10: 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61  content.    ** a
bc20: 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
bc30: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
bc40: 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
bc50: 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  he page..    */.
bc60: 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73      if( nFree>us
bc70: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
bc80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bc90: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
bca0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
bcb0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46  nFree = (u16)(nF
bcc0: 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74  ree - iCellFirst
bcd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
bce0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Init = 1;.  }.  
bcf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bd00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
bd10: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
bd20: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
bd30: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
bd40: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
bd50: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
bd60: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
bd70: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
bd80: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
bd90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bda0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
bdb0: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
bdc0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
bdd0: 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
bde0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
bdf0: 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
be00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
be10: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
be20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
be30: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
be40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
be50: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
be60: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
be70: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
be80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
be90: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
bea0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
beb0: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
bec0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
bed0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
bee0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
bef0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
bf00: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
bf10: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
bf20: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
bf30: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
bf40: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
bf50: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
bf60: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
bf70: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
bf80: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
bf90: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
bfa0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
bfb0: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
bfc0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
bfd0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bfe0: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
bff0: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c000: 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61  nFree = pBt->usa
c010: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b  bleSize - first;
c020: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
c030: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
c040: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c050: 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d   = hdr;.  pPage-
c060: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
c070: 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  rst;.  pPage->nO
c080: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
c090: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
c0a0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
c0b0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
c0c0: 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  8 );.  pPage->ma
c0d0: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
c0e0: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50  geSize - 1;.  pP
c0f0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c100: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c110: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c120: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c130: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c140: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c150: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c160: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c170: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c180: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c190: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c1a0: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c1b0: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c1c0: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c1d0: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c1e0: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c1f0: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c200: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c210: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c220: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c230: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c240: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c250: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c260: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c270: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c280: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c290: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c2a0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c2b0: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c2c0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c2d0: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c2e0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c2f0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c300: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c310: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c320: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c330: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c340: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c350: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c360: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c370: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c380: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c390: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c3a0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c3b0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c3c0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c3d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c3e0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c3f0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c400: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c410: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c420: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c430: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c440: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c450: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c460: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c470: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c480: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c490: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c4a0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c4b0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c4c0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
c4d0: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
c4e0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
c4f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c500: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
c510: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
c520: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
c530: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
c540: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
c550: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
c560: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
c570: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
c580: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
c590: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
c5a0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
c5b0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
c5c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c5d0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c5e0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c5f0: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
c600: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
c610: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
c620: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
c630: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
c640: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
c650: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
c660: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
c670: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
c680: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
c6a0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
c6b0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
c6c0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
c6d0: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
c6e0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
c6f0: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
c700: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
c710: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
c720: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
c730: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
c740: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
c750: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
c760: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
c770: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
c780: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
c790: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
c7a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c7b0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c7c0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
c7d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
c7e0: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
c7f0: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
c800: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
c810: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
c820: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
c830: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
c840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
c850: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
c860: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
c870: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
c880: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
c890: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
c8a0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
c8b0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
c8c0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
c8d0: 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no pagerPagecoun
c8e0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
c8f0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20  {.  int nPage = 
c900: 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  -1;.  int rc;.  
c910: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
c920: 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ge1 );.  rc = sq
c930: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
c940: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
c950: 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65   &nPage);.  asse
c960: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
c970: 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29  K || nPage==-1 )
c980: 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f  ;.  return (Pgno
c990: 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nPage;.}../*.**
c9a0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
c9b0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
c9c0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
c9d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
c9e0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
c9f0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
ca00: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
ca10: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
ca20: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
ca30: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
ca40: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ca50: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
ca60: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
ca70: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
ca80: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
ca90: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
caa0: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
cab0: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
cac0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
cad0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
cae0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
caf0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
cb00: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
cb10: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
cb20: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cb30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
cb40: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
cb50: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
cb60: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
cb70: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
cb80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
cb90: 74 20 72 63 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  t rc;.  TESTONLY
cba0: 28 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 20 3d  ( Pgno iLastPg =
cbb0: 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
cbc0: 70 42 74 29 3b 20 29 0a 20 20 61 73 73 65 72 74  pBt); ).  assert
cbd0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
cbe0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
cbf0: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 62 74 72 65   );..  rc = btre
cc00: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
cc10: 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
cc20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cc30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
cc40: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
cc50: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cc60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cc70: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
cc80: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
cc90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
cca0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
ccb0: 67 65 20 6e 75 6d 62 65 72 20 77 61 73 20 65 69  ge number was ei
ccc0: 74 68 65 72 20 30 20 6f 72 20 67 72 65 61 74 65  ther 0 or greate
ccd0: 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 0a  r than the page.
cce0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74    ** number of t
ccf0: 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
cd00: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
cd10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
cd20: 6c 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  ld return.  ** S
cd30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72  QLITE_CORRUPT or
cd40: 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
cd50: 72 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 46  r (i.e. SQLITE_F
cd60: 55 4c 4c 29 2e 20 43 68 65 63 6b 20 74 68 61 74  ULL). Check that
cd70: 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68   this.  ** is th
cd80: 65 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
cd90: 73 65 72 74 28 20 28 70 67 6e 6f 3e 30 20 26 26  sert( (pgno>0 &&
cda0: 20 70 67 6e 6f 3c 3d 69 4c 61 73 74 50 67 29 20   pgno<=iLastPg) 
cdb0: 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
cdc0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
cdd0: 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 74 65 73  pgno==0 );.  tes
cde0: 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 69 4c 61  tcase( pgno==iLa
cdf0: 73 74 50 67 20 29 3b 0a 0a 20 20 72 65 74 75 72  stPg );..  retur
ce00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
ce10: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
ce20: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
ce30: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
ce40: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
ce50: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74  call to btreeGet
ce60: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
ce70: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
ce80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
ce90: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
cea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ceb0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
cec0: 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
ced0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61  PageRefcount(pPa
cee0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  ge->pDbPage)>1 )
cef0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
cf00: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
cf10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
cf20: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
cf30: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
cf40: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
cf50: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
cf60: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
cf70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
cf80: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
cf90: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
cfa0: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
cfb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cfc0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
cfd0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
cfe0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
cff0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
d000: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
d010: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
d020: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
d030: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
d040: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
d050: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
d060: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
d070: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
d080: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
d090: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
d0a0: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
d0b0: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
d0c0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
d0d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d0e0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d0f0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
d100: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
d110: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
d120: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d130: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
d140: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
d150: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
d160: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
d170: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
d180: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d190: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
d1a0: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
d1b0: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d1c0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
d1d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d1e0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d1f0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
d200: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
d210: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d220: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d230: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d240: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
d250: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
d260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d270: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d280: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
d290: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
d2a0: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
d2b0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
d2c0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
d2d0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
d2e0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
d2f0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
d300: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
d310: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
d320: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
d330: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
d340: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d350: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
d360: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
d370: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
d380: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
d390: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
d3a0: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
d3b0: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
d3c0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
d3d0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
d3e0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
d3f0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
d400: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
d410: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
d420: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
d430: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
d440: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d450: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
d460: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
d470: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
d480: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
d490: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
d4a0: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
d4b0: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
d4c0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
d4d0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
d4e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d4f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d500: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d510: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d520: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d530: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
d540: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
d550: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
d560: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
d570: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
d580: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
d590: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
d5a0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d5b0: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
d5c0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
d5d0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
d5e0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
d5f0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
d600: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
d610: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
d620: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d630: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
d640: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d650: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
d660: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d670: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
d680: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
d690: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
d6a0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
d6b0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
d6c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d6d0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
d6e0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d6f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
d700: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
d710: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
d720: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
d730: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
d740: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
d750: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
d760: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
d770: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
d780: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
d790: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
d7a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d7b0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
d7c0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
d7d0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
d7e0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
d7f0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d800: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d810: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d820: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d830: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d850: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d860: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
d870: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d880: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d890: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d8a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d8b0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d8c0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d8d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d8f0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
d900: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
d910: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
d920: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
d930: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
d940: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
d950: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
d960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d970: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
d980: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
d990: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
d9a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
d9b0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
d9c0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
d9d0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
da00: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
da10: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
da20: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
da30: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
da40: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
da50: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
da60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
da70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
da80: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
da90: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
daa0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
dad0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
dae0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
daf0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
db00: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
db10: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
db20: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
db30: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
db40: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
db50: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
db60: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
db70: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
db80: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
db90: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
dba0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
dbb0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
dbc0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
dbd0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
dbe0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
dbf0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
dc00: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
dc10: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
dc20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
dc30: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
dc40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dc50: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
dc60: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
dc70: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
dc80: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dc90: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
dca0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
dcb0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
dcc0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
dcd0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
dce0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
dcf0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
dd00: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
dd10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dd20: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
dd30: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
dd40: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
dd50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
dd60: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
dd70: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
dd80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
dd90: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
dda0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
ddb0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
ddc0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
ddd0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
dde0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
ddf0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
de00: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
de10: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
de20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
de30: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
de40: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
de50: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
de60: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
de70: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
de80: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
de90: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
dea0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
deb0: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
dec0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
ded0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
dee0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
def0: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
df00: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
df10: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
df20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68  3GlobalConfig.sh
df30: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
df40: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
df50: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
df60: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
df70: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
df80: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
df90: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c  lite3Malloc(nFul
dfa0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
dfb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
dfc0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
dfd0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
dfe0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
dff0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e000: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e010: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e030: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e040: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
e050: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
e060: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
e070: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
e080: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e090: 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
e0a0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
e0b0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
e0c0: 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
e0d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e0e0: 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
e0f0: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
e100: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
e110: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
e120: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
e130: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e140: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
e150: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e160: 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
e170: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
e180: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
e190: 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
e1a0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
e1b0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
e1c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
e1d0: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
e1e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
e1f0: 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
e200: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a  e(pBt->pPager)).
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
e230: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
e240: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
e250: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
e260: 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
e270: 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
e280: 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
e290: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
e2a0: 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
e2b0: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
e2c0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
e2d0: 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
e2e0: 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e300: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e310: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
e330: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e340: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
e350: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e360: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
e370: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
e380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e390: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
e3a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e3b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
e3d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e3e0: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
e400: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
e410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
e420: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
e430: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e440: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
e450: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e460: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
e470: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
e480: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
e490: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
e4a0: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
e4b0: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
e4c0: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
e4d0: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
e4e0: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
e4f0: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
e500: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
e510: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
e520: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
e530: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
e540: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
e550: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
e560: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
e570: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
e580: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
e590: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
e5a0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
e5b0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
e5c0: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
e5d0: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
e5e0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
e5f0: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
e600: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
e610: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
e620: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
e630: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
e640: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
e650: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
e660: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
e670: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
e680: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
e690: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
e6a0: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
e6b0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
e6c0: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
e6d0: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
e6e0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
e6f0: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
e700: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
e710: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
e720: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
e730: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
e740: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
e750: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e760: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
e770: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
e780: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
e790: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
e7a0: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
e7b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
e7c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
e7d0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e7e0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
e7f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
e800: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
e810: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
e820: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
e840: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
e850: 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
e860: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
e870: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e880: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e890: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
e8a0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
e8b0: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
e8c0: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
e8d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e8e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e8f0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e900: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e910: 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  }.    pBt->db = 
e920: 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
e930: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
e940: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
e950: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
e960: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
e970: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
e980: 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
e990: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
e9a0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
e9b0: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
e9c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
e9d0: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
e9e0: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
e9f0: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
ea00: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
ea10: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
ea20: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
ea30: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
ea40: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
ea50: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
ea60: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
ea70: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
ea80: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
ea90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
eaa0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
eab0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
eac0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ead0: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
eae0: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
eaf0: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
eb00: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
eb10: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
eb20: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
eb30: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
eb40: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
eb50: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
eb60: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
eb70: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
eb80: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
eb90: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
eba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
ebb0: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
ebc0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
ebd0: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
ebe0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
ebf0: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
ec00: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
ec10: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
ec20: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
ec30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ec40: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
ec50: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
ec60: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
ec70: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
ec80: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ec90: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
eca0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
ecb0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
ecc0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
ecd0: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
ece0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
ecf0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
ed00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ed10: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
ed20: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
ed30: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
ed40: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
ed50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ed60: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
ed70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ed80: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
ed90: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
eda0: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
edb0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
edc0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
edd0: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
ede0: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
edf0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
ee00: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
ee10: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
ee20: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
ee30: 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
ee40: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
ee50: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
ee60: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ee70: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
ee80: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
ee90: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
eea0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
eeb0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
eec0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
eed0: 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
eee0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eef0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ef00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
ef10: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
ef20: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
ef30: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
ef40: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
ef50: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
ef60: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
ef70: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
ef80: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
ef90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
efa0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
efb0: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
efc0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
efd0: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
efe0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
eff0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
f000: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
f010: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
f020: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
f030: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
f040: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
f050: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
f060: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f070: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
f080: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
f090: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
f0a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f0b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f0c0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
f0d0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
f0e0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
f0f0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
f100: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f110: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f120: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
f130: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
f140: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
f150: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f160: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
f170: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
f180: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f190: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
f1a0: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
f1b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f1c0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f1d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
f1e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
f1f0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f200: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
f210: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
f220: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
f230: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
f240: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
f250: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
f260: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
f270: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
f280: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
f290: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
f2a0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
f2b0: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
f2c0: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
f2d0: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
f2e0: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
f2f0: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
f300: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
f310: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
f320: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f330: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f340: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
f350: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
f360: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
f370: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
f380: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
f390: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
f3a0: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
f3b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
f3c0: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
f3d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
f3e0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f3f0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
f400: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
f410: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
f420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f430: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
f440: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
f450: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
f460: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f470: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
f480: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
f490: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
f4a0: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
f4b0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
f4c0: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
f4d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
f4e0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
f4f0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
f500: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
f510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f520: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
f530: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f550: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f560: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
f570: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
f580: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
f590: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f5a0: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
f5b0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
f5c0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
f5d0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f5e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f5f0: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
f600: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f610: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
f620: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74  0;.  }.  if( mut
f630: 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
f640: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f650: 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
f660: 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
f670: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f680: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
f690: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f6a0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
f6b0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
f6c0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
f6d0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
f6e0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
f6f0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
f700: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
f710: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
f720: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
f730: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f740: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
f750: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
f760: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
f770: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
f780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f790: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
f7a0: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
f7b0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
f7c0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f7d0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
f7e0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
f7f0: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
f800: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
f810: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
f820: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
f830: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
f840: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
f850: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f860: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f870: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f880: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f890: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
f8a0: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
f8b0: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
f8c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
f8d0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f8e0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f8f0: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
f900: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
f910: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f920: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
f930: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
f940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
f950: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
f960: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f970: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
f980: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
f990: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
f9a0: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
f9b0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
f9c0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
f9d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
f9e0: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
f9f0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
fa00: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
fa10: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
fa20: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
fa30: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
fa40: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
fa50: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
fa60: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
fa70: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
fa80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fa90: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
faa0: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
fab0: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
fac0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
fad0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
fae0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
faf0: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
fb00: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
fb10: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
fb20: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
fb30: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
fb40: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
fb50: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
fb60: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
fb70: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fb80: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
fb90: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
fba0: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
fbb0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
fbc0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
fbd0: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
fbe0: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
fbf0: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
fc00: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
fc10: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
fc20: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
fc30: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
fc40: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
fc50: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
fc60: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
fc70: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
fc80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fc90: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
fca0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
fcb0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
fcc0: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
fcd0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
fce0: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
fcf0: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
fd00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fd10: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
fd20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
fd30: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
fd40: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
fd50: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
fd60: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
fd70: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
fd80: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
fd90: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
fda0: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
fdb0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
fdc0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
fdd0: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
fde0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
fdf0: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
fe00: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
fe10: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
fe20: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
fe30: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
fe40: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
fe50: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
fe60: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
fe70: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
fe80: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
fe90: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
fea0: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
feb0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
fec0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
fed0: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
fee0: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
fef0: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
ff00: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
ff10: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
ff20: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
ff30: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
ff40: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
ff50: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
ff60: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
ff70: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
ff80: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
ff90: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
ffa0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
ffb0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
ffc0: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
ffd0: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
ffe0: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
fff0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
10000 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
10010 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
10020 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
10030 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
10040 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
10050 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
10060 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
10070 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
10080 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
10090 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
100a0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
100b0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
100c0 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
100d0 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
100e0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
100f0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
10100 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10110 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10120 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
10130 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
10140 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
10150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10160 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
10170 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10180 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
10190 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
101a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
101b0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
101c0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
101d0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
101e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
101f0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
10200 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10210 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
10220 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
10230 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10240 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10250 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
10260 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
10270 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
10280 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
10290 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
102a0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
102b0 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
102c0 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
102d0 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
102e0 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
102f0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
10300 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
10310 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
10320 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
10330 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
10340 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
10350 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
10360 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
10370 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
10380 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
10390 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
103a0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
103b0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
103c0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
103d0 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
103e0 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
103f0 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
10400 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
10410 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
10420 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
10430 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
10440 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
10450 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
10460 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
10470 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
10480 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
10490 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
104a0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
104b0 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
104c0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
104d0 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
104e0 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
104f0 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
10500 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
10510 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
10520 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
10530 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
10540 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10550 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10560 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10570 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10580 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10590 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
105a0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
105b0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
105c0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
105d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
105e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
105f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10600 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
10610 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
10620 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
10630 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
10640 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
10650 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
10660 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
10670 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
10680 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
10690 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
106a0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
106b0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
106c0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
106d0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
106e0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
106f0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
10700 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
10710 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
10720 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
10730 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
10740 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10750 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
10760 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
10770 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
10780 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
10790 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
107a0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
107b0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
107c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
107d0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
107e0 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
107f0 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
10800 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
10810 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
10820 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10830 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10850 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10860 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10870 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
10880 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
10890 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
108a0 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
108b0 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
108c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
108d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
108e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
108f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
10900 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
10910 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
10920 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
10930 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
10940 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
10950 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
10960 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
10970 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
10980 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
10990 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
109a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
109b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
109c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
109d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
109e0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
109f0 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
10a00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
10a10 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
10a20 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
10a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
10a40 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
10a50 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
10a60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
10a80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10a90 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
10aa0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
10ab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
10ac0 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  UM)./*.** Change
10ad0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
10ae0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
10af0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
10b00 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
10b10 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
10b20 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
10b30 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
10b40 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10b50 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
10b60 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
10b70 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
10b80 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
10b90 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
10ba0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
10bb0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
10bc0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
10bd0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
10be0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
10bf0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
10c00 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
10c10 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
10c20 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
10c30 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
10c40 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
10c50 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
10c60 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
10c70 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
10c80 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
10c90 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
10ca0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
10cb0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
10cc0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
10cd0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
10ce0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
10cf0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10d00 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
10d10 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
10d20 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
10d30 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10d40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10d50 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
10d60 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
10d70 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
10d80 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
10d90 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69   then the pageSi
10da0 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20  zeFixed flag is 
10db0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
10dc0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
10dd0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
10de0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
10df0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
10e00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
10e10 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10e20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
10e30 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
10e40 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
10e50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10e60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10e70 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
10e80 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
10e90 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
10ea0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
10eb0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10ec0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
10ed0 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
10ee0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10ef0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
10f00 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
10f10 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
10f20 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
10f30 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
10f40 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
10f50 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
10f60 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
10f70 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
10f80 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
10f90 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
10fa0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
10fb0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
10fc0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
10fd0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
10fe0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
10ff0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
11000 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11010 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
11020 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
11030 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
11040 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
11050 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
11060 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11070 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11080 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11090 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
110a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
110b0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
110c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
110d0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
110e0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
110f0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
11100 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
11110 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11120 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11130 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11140 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11150 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
11160 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
11170 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
11180 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
11190 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
111a0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
111b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
111c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
111d0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
111e0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
111f0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
11200 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
11210 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
11220 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
11230 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
11240 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
11250 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
11260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11270 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
11280 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
11290 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
112a0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
112b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
112c0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
112d0 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
112e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
112f0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11300 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
11310 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
11320 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
11330 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
11340 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
11350 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
11360 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
11370 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
11380 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
11390 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
113a0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
113b0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
113c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
113d0 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
113e0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
113f0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
11400 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11410 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
11420 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11430 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
11440 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11450 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11460 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
11470 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
11480 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
11490 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
114a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
114b0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
114c0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
114d0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
114e0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
114f0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
11500 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
11510 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
11520 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
11530 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
11540 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
11550 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
11560 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
11570 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
11580 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
11590 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
115a0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
115b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
115c0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
115d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
115e0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
115f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
11600 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
11610 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11620 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
11630 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
11640 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
11650 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11660 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
11670 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
11680 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
11690 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
116a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
116b0 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
116c0 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
116d0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
116e0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
116f0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
11710 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11720 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
11730 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
11740 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
11750 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11760 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11770 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
11780 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
11790 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
117a0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
117b0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
117c0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
117d0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
117e0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
117f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11800 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
11810 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
11820 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11830 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11840 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
11850 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
11860 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
11870 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11880 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
11890 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
118a0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
118b0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
118c0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
118d0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
118e0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
118f0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
11900 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
11910 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11930 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
11940 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
11950 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
11960 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11970 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
11980 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
11990 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
119a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
119b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
119c0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
119d0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
119e0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
119f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
11a00 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
11a10 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
11a20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
11a30 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
11a40 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
11a50 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
11a60 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
11a70 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
11a80 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
11a90 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
11aa0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
11ab0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
11ac0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11ad0 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
11ae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11af0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11b00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11b10 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
11b20 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
11b30 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
11b40 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
11b50 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
11b60 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
11b70 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
11b80 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
11b90 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
11ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11bb0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11bc0 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
11bd0 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
11be0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
11bf0 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
11c00 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
11c10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
11c20 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
11c30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
11c40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
11c50 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
11c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11c70 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11c80 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
11c90 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
11ca0 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
11cb0 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
11cc0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
11cd0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
11ce0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
11cf0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
11d00 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
11d10 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
11d20 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
11d30 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11d40 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
11d50 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
11d60 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
11d70 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
11d80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11d90 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
11da0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11db0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11dc0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
11dd0 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
11de0 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
11df0 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
11e00 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
11e10 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
11e20 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
11e30 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
11e40 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
11e50 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
11e60 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
11e70 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
11e80 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
11e90 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
11ea0 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
11eb0 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
11ec0 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
11ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11ee0 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
11ef0 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
11f00 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
11f10 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11f20 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11f30 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
11f40 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
11f50 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
11f60 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11f70 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
11f80 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
11f90 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
11fa0 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
11fb0 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
11fc0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
11fd0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
11fe0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11ff0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12000 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
12010 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
12020 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
12030 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
12040 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
12050 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
12060 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
12070 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
12080 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
12090 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
120a0 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
120b0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
120c0 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
120d0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
120e0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
120f0 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
12100 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
12110 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
12120 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
12130 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
12140 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
12150 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
12160 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
12170 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
12180 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
12190 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
121a0 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
121b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
121c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
121d0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
121e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
121f0 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
12200 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
12210 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
12220 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
12230 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
12240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12250 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
12260 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
12270 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
122b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
122c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
122d0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
122e0 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
122f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12300 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12310 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
12320 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
12330 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
12340 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
12350 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
12360 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12370 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
12380 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
12390 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
123a0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
123b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
123c0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
123d0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
123e0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
123f0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
12400 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
12410 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
12420 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
12430 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
12440 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
12450 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
12460 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
12470 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
12480 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
12490 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
124a0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
124b0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
124c0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
124d0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
124e0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
124f0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
12500 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12510 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
12520 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
12530 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
12540 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
12550 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
12560 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
12570 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
12580 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
12590 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
125a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
125b0 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
125c0 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
125d0 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
125e0 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
125f0 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
12600 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
12610 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
12620 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
12630 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
12640 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
12650 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
12660 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
12670 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
12680 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
12690 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
126a0 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78  - 23;.  pBt->max
126b0 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62  Leaf = pBt->usab
126c0 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70  leSize - 35;.  p
126d0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70  Bt->minLeaf = (p
126e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
126f0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
12700 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
12710 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
12720 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
12730 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
12740 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
12750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12760 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
12770 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
12780 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
12790 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
127a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
127b0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
127c0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
127d0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
127e0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
127f0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
12800 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
12810 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
12820 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
12830 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
12840 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
12850 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
12860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12870 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
12880 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
12890 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
128a0 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
128b0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
128c0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
128d0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
128e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
128f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
12900 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12910 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
12920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12940 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
12950 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
12960 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  sor==0 || pBt->i
12970 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
12980 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
12990 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
129a0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
129b0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
129c0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
129d0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
129e0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
129f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
12a00 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
12a10 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
12a20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
12a30 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
12a40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
12a50 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
12a60 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12a70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
12a80 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
12a90 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
12aa0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
12ab0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
12ac0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
12ad0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
12ae0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
12af0 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
12b00 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
12b10 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
12b20 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
12b30 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12b40 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
12b50 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
12b60 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  rc;.  int nPage;
12b70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12b80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12b90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12ba0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12bb0 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
12bc0 20 62 65 65 6e 20 6d 65 61 73 75 72 65 64 20 61   been measured a
12bd0 6e 64 20 63 61 63 68 65 64 2c 20 73 6f 20 66 61  nd cached, so fa
12be0 69 6c 75 72 65 0a 20 20 2a 2a 20 69 73 20 69 6d  ilure.  ** is im
12bf0 70 6f 73 73 69 62 6c 65 20 68 65 72 65 2e 20 20  possible here.  
12c00 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
12c10 73 69 7a 65 20 6d 65 61 73 75 72 65 6d 65 6e 74  size measurement
12c20 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 0a 20 20   failed, then.  
12c30 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 61 62  ** processing ab
12c40 6f 72 74 73 20 62 65 66 6f 72 65 20 65 6e 74 65  orts before ente
12c50 72 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ring this routin
12c60 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e. */.  rc = sql
12c70 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
12c80 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
12c90 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 4e  &nPage);.  if( N
12ca0 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f  EVER(rc!=SQLITE_
12cb0 4f 4b 29 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  OK) || nPage>0 )
12cc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12cd0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
12ce0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
12cf0 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
12d00 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
12d10 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
12d20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
12d30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
12d40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12d50 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
12d60 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
12d70 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12d80 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
12d90 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
12da0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
12db0 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
12dc0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
12dd0 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
12de0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
12df0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12e00 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
12e10 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
12e20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
12e30 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
12e40 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
12e50 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
12e60 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
12e70 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
12e80 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
12e90 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
12ea0 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
12eb0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
12ec0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
12ed0 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
12ee0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
12ef0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
12f00 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
12f10 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
12f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12f30 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
12f40 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
12f50 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
12f60 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
12f70 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
12f80 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
12f90 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
12fa0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12fb0 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
12fc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
12fd0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
12fe0 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
12ff0 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
13000 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
13010 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13020 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
13030 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
13040 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
13050 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13060 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
13070 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13080 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
13090 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
130a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
130b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
130c0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
130d0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
130e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
130f0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
13100 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
13110 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
13120 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
13130 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13140 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
13150 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
13160 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
13170 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
13180 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
13190 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
131a0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
131b0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
131c0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
131d0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
131e0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
131f0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
13200 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13210 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
13220 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
13230 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
13240 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
13250 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
13260 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
13270 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13280 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
13290 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
132a0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
132b0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
132c0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
132d0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
132e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
132f0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
13300 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
13310 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
13320 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
13330 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
13340 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
13350 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13360 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
13370 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
13380 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
13390 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
133a0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
133b0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
133c0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
133d0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
133e0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
133f0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
13400 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
13410 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
13420 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
13430 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13440 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
13450 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
13460 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
13470 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
13480 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
13490 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
134a0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
134b0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
134c0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
134d0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
134e0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
134f0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
13500 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
13510 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
13520 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
13530 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
13540 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
13550 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
13560 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
13570 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
13580 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
13590 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
135a0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
135b0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
135c0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
135d0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
135e0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
135f0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
13600 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
13610 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
13620 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
13630 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
13640 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
13650 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
13660 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
13670 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
13680 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
13690 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
136a0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
136b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
136c0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
136d0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
136e0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
136f0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
13700 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13710 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
13720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13730 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13740 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
13750 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13760 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
13770 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
13780 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
13790 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
137a0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
137b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
137c0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
137d0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
137e0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
137f0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
13800 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13810 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
13820 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13830 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
13840 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
13850 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13860 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
13870 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
13880 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
13890 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
138a0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
138b0 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
138c0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
138d0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
138e0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
138f0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
13900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13910 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
13920 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
13930 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
13940 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
13950 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13960 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
13970 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
13980 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
13990 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
139a0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
139b0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
139c0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
139d0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
139e0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
139f0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13a00 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
13a10 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
13a20 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
13a30 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
13a40 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
13a50 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
13a60 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
13a70 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
13a80 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
13a90 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
13aa0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
13ab0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13ac0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13ad0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13ae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13af0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13b00 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
13b10 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
13b20 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
13b30 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
13b40 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
13b50 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13b60 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13b70 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13b80 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13b90 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13ba0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13bb0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13bc0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13bd0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13be0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13bf0 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
13c00 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
13c10 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
13c20 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
13c30 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
13c40 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
13c50 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13c60 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13c70 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13c80 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
13c90 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
13ca0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64  rans_begun;..  d
13cb0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
13cc0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
13cd0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
13ce0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
13cf0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
13d00 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
13d10 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
13d20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
13d30 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
13d40 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
13d50 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
13d60 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
13d70 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
13d80 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
13d90 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
13da0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
13db0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
13dc0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
13dd0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
13de0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
13df0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
13e00 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
13e10 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
13e20 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
13e30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
13e40 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
13e50 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
13e60 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
13e70 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
13e80 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
13e90 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
13ea0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
13eb0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
13ec0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
13ed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13ee0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
13ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13f00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13f10 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
13f20 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
13f30 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
13f40 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
13f50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13f70 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
13f80 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
13f90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13fa0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
13fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13fc0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
13fd0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
13fe0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
13ff0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
14000 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14010 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
14020 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
14030 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
14040 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
14050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14060 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
14070 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
14080 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
14090 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
140a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
140b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
140c0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
140d0 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
140e0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
140f0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
14100 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
14110 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
14120 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
14130 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
14140 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
14150 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
14160 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
14170 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
14180 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
14190 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
141a0 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
141b0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
141c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
141d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
141e0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
141f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
14200 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
14210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14220 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14230 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
14240 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14250 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
14260 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
14270 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
14280 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
14290 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
142a0 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
142b0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
142c0 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
142d0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
142e0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
142f0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
14300 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
14310 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
14320 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
14330 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
14340 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
14350 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
14360 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
14370 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
14380 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
14390 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
143a0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
143b0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
143c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
143d0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
143e0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
143f0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
14400 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
14410 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14420 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14430 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14440 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14450 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14460 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
14470 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
14480 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
14490 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
144a0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
144b0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
144c0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
144d0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
144e0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
144f0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
14500 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
14510 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
14520 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
14530 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
14540 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
14550 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
14580 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
14590 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
145c0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
145d0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
145e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14600 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14620 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
14630 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14640 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14650 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
14660 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
14670 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14680 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14690 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
146a0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
146b0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
146c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
146d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
146e0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
146f0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
14700 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14710 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
14720 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
14730 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14740 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
14750 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
14760 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14770 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
14780 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14790 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
147a0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
147b0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
147c0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
147d0 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
147e0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
147f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14800 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14810 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
14820 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
14830 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
14840 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
14850 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
14860 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
14870 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
14880 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
14890 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
148a0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
148b0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
148c0 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
148d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
148e0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
148f0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14900 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
14910 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
14920 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
14930 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
14940 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
14950 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
14960 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
14970 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
14980 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
14990 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
149a0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
149b0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
149c0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
149d0 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
14a00 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
14a10 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
14a20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14a30 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14a40 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
14a50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
14a60 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
14a70 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
14a80 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
14a90 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
14aa0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
14ab0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
14ac0 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
14ad0 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
14ae0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
14af0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
14b00 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
14b10 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
14b20 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
14b30 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
14b40 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
14b50 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
14b60 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
14b70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14b80 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14b90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14ba0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
14bb0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
14bc0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
14bd0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14be0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
14bf0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
14c00 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
14c10 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
14c20 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
14c30 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
14c40 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
14c50 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
14c60 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
14c70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14c80 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
14c90 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
14ca0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
14cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
14cc0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
14cd0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
14ce0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
14cf0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
14d00 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
14d10 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
14d20 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
14d30 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
14d40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
14d50 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
14d60 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
14d70 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14d80 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
14d90 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
14da0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
14db0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
14dc0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
14dd0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
14de0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
14df0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
14e00 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
14e10 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14e20 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
14e30 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
14e40 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14e50 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14e70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
14e80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14ea0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
14eb0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
14ec0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14ed0 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
14ee0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14f00 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
14f10 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
14f20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
14f30 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
14f40 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
14f50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
14f60 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
14f70 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
14f80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14f90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14fa0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
14fb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
14fc0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
14fd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
14fe0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
14ff0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
15000 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
15010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15020 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
15030 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
15040 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
15050 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
15060 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
15070 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
15080 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
15090 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
150a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
150b0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
150c0 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
150d0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
150e0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
150f0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
15100 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
15110 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
15120 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
15130 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15140 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15150 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
15160 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
15170 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
15180 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
15190 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
151a0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
151b0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
151c0 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
151d0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
151e0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
151f0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
15200 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
15210 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15220 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
15230 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15240 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15250 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
15260 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
15270 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
15280 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15290 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
152a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
152b0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
152c0 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
152d0 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
152e0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
152f0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
15300 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
15310 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
15320 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
15330 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
15340 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
15350 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
15360 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
15370 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
15380 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
15390 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
153a0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
153b0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
153c0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
153d0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
153e0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
153f0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
15400 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15410 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15420 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
15430 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15440 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
15460 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
15470 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
15480 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
15490 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
154a0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
154b0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
154c0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
154d0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
154e0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
154f0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
15500 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
15510 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
15520 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
15530 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
15540 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15550 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
15560 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
15570 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
15580 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
15590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
155a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
155b0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
155c0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
155d0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
155e0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
155f0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
15600 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
15610 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
15620 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15630 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
15640 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15650 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
15660 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
15670 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
15680 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
15690 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
156a0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
156b0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
156c0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
156d0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
156e0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
156f0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
15700 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15710 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
15720 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15730 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
15740 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15750 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
15760 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
15770 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15780 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15790 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
157a0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
157b0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
157c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
157d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
157e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
157f0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
15800 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15810 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15820 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15830 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
15840 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15850 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
15860 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
15870 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
15880 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15890 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
158a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
158b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
158c0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
158d0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
158e0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
158f0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
15900 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
15910 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
15920 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
15930 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
15940 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
15950 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
15960 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
15970 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15980 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
15990 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
159a0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
159b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
159c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
159d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
159e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
159f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15a00 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
15a10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15a40 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
15a50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15a60 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
15a70 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
15a80 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
15a90 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
15aa0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
15ab0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
15ac0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
15ae0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
15af0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
15b00 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
15b10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15b20 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
15b30 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
15b40 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
15b50 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
15b60 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
15b70 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
15b80 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
15b90 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
15ba0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
15bb0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
15bc0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
15bd0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
15be0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
15bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15c00 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
15c10 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
15c20 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
15c30 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
15c40 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
15c50 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
15c60 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
15c70 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
15c80 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
15c90 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
15ca0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
15cb0 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
15cc0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
15cd0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
15ce0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
15cf0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
15d00 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
15d10 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
15d20 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
15d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
15d40 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
15d50 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
15d60 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
15d70 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
15d80 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
15d90 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
15da0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
15db0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
15dc0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15de0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
15df0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
15e00 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
15e10 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
15e20 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
15e30 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
15e40 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
15e50 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
15e60 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
15e70 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
15e80 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
15e90 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
15ea0 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
15eb0 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
15ec0 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
15ed0 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
15ee0 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
15ef0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
15f00 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
15f10 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
15f20 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
15f30 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
15f40 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
15f50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
15f60 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
15f70 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
15f80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15f90 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
15fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
15fb0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
15fc0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
15fd0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
15fe0 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
15ff0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
16000 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16010 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38    int rc;.    u8
16020 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
16030 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
16040 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
16050 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16060 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
16070 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
16080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
16090 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
160a0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
160b0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
160c0 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
160d0 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
160e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
160f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16100 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16110 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16120 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16130 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16140 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16160 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
16170 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
16180 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
16190 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
161a0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
161b0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
161c0 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
161d0 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
161e0 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
161f0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
16200 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
16210 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
16220 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
16230 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
16240 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
16250 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
16260 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
16270 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
16280 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
16290 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
162a0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
162b0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
162c0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
162d0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
162e0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
162f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
16300 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
16310 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
16320 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16340 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16350 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16360 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
16370 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
16380 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
16390 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
163a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
163b0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
163c0 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
163d0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
163e0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
163f0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
16400 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
16410 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
16420 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
16430 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
16440 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
16450 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16460 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16480 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
16490 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
164a0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
164b0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
164c0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
164d0 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
164e0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
164f0 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
16500 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
16510 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
16520 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
16530 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
16540 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16550 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
16560 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
16570 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
16580 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
16590 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
165a0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
165b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
165c0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
165d0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
165e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
165f0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
16600 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
16610 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
16620 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
16630 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16650 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
16660 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
16670 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16680 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
16690 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
166a0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
166b0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
166c0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
166d0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
166e0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
166f0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
16700 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16710 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
16720 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
16730 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16750 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
16760 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
16770 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
16780 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
16790 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
167a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
167b0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
167c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
167d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
167e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
167f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
16800 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
16810 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77  iLastPg--;.    w
16820 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
16830 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16840 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
16850 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
16860 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
16870 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
16880 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
16890 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
168a0 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  pPg;.        int
168b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
168c0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
168d0 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
168e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
168f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16920 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16930 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
16940 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
16950 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
16960 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16980 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16990 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
169a0 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   }.      iLastPg
169b0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  --;.    }.    sq
169c0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
169d0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
169e0 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20  ger, iLastPg);. 
169f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16a00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16a10 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
16a20 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
16a30 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
16a40 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
16a50 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
16a60 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
16a70 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
16a80 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16a90 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
16aa0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
16ab0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
16ac0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16ad0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
16ae0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
16af0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
16b00 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
16b10 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
16b20 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
16b30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16b40 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
16b50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16b60 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
16b70 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
16b80 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16b90 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
16ba0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16bb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16bc0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
16bd0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
16be0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16bf0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
16c00 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
16c10 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
16c20 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
16c30 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
16c40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16c50 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
16c60 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
16c70 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
16c80 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70  umStep(pBt, 0, p
16c90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
16ca0 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t));.  }.  sqlit
16cb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16cc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16cd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16ce0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
16cf0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
16d00 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
16d10 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
16d20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
16d30 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
16d40 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
16d50 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
16d60 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
16d70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
16d80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16d90 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
16da0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
16db0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
16dc0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
16dd0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
16de0 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
16df0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
16e00 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
16e10 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
16e20 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
16e30 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
16e40 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
16e50 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
16e60 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
16e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16e80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16e90 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
16ea0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
16eb0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
16ec0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
16ed0 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
16ee0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16ef0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16f00 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
16f10 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
16f20 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
16f30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
16f40 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
16f50 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
16f60 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
16f70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16f80 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
16f90 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
16fa0 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
16fb0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
16fc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16fd0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
16fe0 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
16ff0 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
17000 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
17010 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
17020 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
17030 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
17040 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
17050 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
17060 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
17070 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
17080 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
17090 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
170a0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
170b0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
170c0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
170d0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
170e0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
170f0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
17100 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
17110 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17120 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
17130 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17140 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
17150 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
17160 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
17170 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
17180 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
17190 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
171a0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
171b0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
171c0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
171d0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
171e0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
171f0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
17200 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
17210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
17220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17230 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
17240 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
17250 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
17260 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
17270 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
17280 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
17290 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
172a0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
172b0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
172c0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
172d0 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
172e0 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
172f0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
17300 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
17310 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
17320 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
17330 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
17340 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
17350 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
17360 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
17370 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
17380 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
17390 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
173a0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
173b0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
173c0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
173d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
173e0 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
173f0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
17400 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
17410 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
17420 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
17430 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
17440 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
17450 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
17460 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
17470 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
17480 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
17490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
174a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
174b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
174c0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
174d0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
174e0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
174f0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
17500 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17510 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
17520 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
17530 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
17540 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
17550 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
17560 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
17570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17580 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
17590 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
175a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
175b0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
175c0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
175d0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
175e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
175f0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
17600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17610 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
17620 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
17630 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
17640 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
17650 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
17660 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
17670 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
17680 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
17690 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
176a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
176b0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
176c0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
176d0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
176e0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
176f0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
17700 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
17710 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
17720 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
17730 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
17740 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
17750 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
17760 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
17770 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
17780 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
177a0 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
177b0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
177c0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
177d0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
177e0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
177f0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
17800 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
17810 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17820 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
17830 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
17840 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
17850 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
17860 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
17870 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
17880 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
17890 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
178a0 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
178b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
178c0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
178d0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
178e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
178f0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
17900 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
17910 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
17920 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
17930 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
17940 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
17950 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
17960 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
17970 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
17980 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
17990 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
179a0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
179b0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
179c0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
179d0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
179e0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
179f0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
17a00 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
17a10 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
17a20 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
17a30 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
17a40 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17a50 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
17a60 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
17a70 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
17a80 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
17a90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17aa0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
17ab0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
17ac0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
17ad0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
17ae0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
17af0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
17b00 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
17b10 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
17b20 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
17b30 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
17b40 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
17b50 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
17b60 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
17b70 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
17b80 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
17b90 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
17ba0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17bb0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
17bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
17bd0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
17be0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17bf0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
17c00 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
17c10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17c20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
17c30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17c40 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
17c50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17c60 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
17c70 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17c80 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
17c90 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
17ca0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17cc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17cd0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
17ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17cf0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
17d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17d10 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
17d20 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
17d30 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
17d40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17d50 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
17d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17d70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d80 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
17d90 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
17da0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
17db0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
17dc0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
17dd0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
17de0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
17df0 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
17e00 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
17e10 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17e20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17e30 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  BtCursor *pCsr;.
17e40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17e50 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
17e60 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  (p) );..  /* Sea
17e70 72 63 68 20 66 6f 72 20 61 20 63 75 72 73 6f 72  rch for a cursor
17e80 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20 74 68   held open by th
17e90 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  is b-tree connec
17ea0 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78 69  tion. If one exi
17eb0 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  sts,.  ** then t
17ec0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
17ed0 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61 64 65  ill be downgrade
17ee0 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  d to a read-only
17ef0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
17f00 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74  * instead of act
17f10 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 2e  ually concluded.
17f20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
17f30 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61 73  ll to CommitPhas
17f40 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72 20  eTwo() .  ** or 
17f50 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c 20  Rollback() will 
17f60 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e 73  finish the trans
17f70 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
17f80 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  k the database. 
17f90 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d 70   */.  for(pCsr=p
17fa0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 73  Bt->pCursor; pCs
17fb0 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72 65  r && pCsr->pBtre
17fc0 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73 72 2d  e!=p; pCsr=pCsr-
17fd0 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73 65 72  >pNext);.  asser
17fe0 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d  t( pCsr==0 || p-
17ff0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
18000 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  ONE );..  btreeC
18010 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
18020 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  Bt);.  if( pCsr 
18030 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  ){.    downgrade
18040 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
18050 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
18060 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
18070 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
18080 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
18090 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
180a0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
180b0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
180c0 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
180d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
180e0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
180f0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
18100 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
18110 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
18120 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
18130 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
18140 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
18150 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
18160 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
18170 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
18180 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
18190 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
181a0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
181b0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
181c0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
181d0 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
181e0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
181f0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
18200 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
18210 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
18220 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
18230 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
18240 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18250 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
18260 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
18270 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
18280 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
18290 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
182a0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
182b0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
182c0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
182d0 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
182e0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
182f0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
18300 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18310 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
18320 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
18340 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18350 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
18360 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
18370 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
18380 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
18390 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
183a0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
183b0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
183c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
183d0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
183e0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
183f0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
18400 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
18410 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
18420 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
18430 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18440 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
18450 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
18460 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
18470 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
18480 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
18490 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
184a0 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
184b0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
184c0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
184d0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
184e0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
184f0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
18500 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
18510 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
18520 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
18530 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
18540 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
18550 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
18560 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
18570 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
18580 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
18590 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
185a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
185b0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
185c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
185d0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
185e0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
185f0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
18600 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18610 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
18620 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
18630 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18640 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18650 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
18660 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
18670 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
18680 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
18690 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
186a0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
186b0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
186c0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
186d0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
186e0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
186f0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
18700 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18710 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
18720 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
18730 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18740 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18750 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18760 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
18770 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
18780 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
18790 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
187a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
187b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
187c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
187d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
187e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
187f0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
18800 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
18810 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
18820 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
18830 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
18840 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18850 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18860 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
18870 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
18880 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
18890 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
188a0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
188b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
188c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
188d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
188e0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
188f0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
18900 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18910 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18920 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
18930 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
18940 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18950 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18960 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
18970 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
18980 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
18990 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
189a0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
189b0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
189c0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
189d0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
189e0 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
189f0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
18a00 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
18a10 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
18a20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
18a30 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
18a40 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
18a50 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
18a60 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
18a70 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
18a80 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
18a90 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
18aa0 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
18ab0 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
18ac0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
18ad0 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
18ae0 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
18af0 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
18b00 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
18b10 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
18b20 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
18b30 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
18b40 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18b50 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
18b60 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
18b70 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
18b80 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
18b90 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
18ba0 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
18bb0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
18bc0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
18bd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
18be0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18bf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
18c00 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
18c10 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
18c20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
18c30 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
18c40 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
18c50 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
18c60 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
18c70 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
18c80 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
18c90 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
18ca0 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
18cb0 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
18cc0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18cd0 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
18ce0 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
18cf0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
18d00 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
18d10 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
18d20 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
18d30 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
18d40 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
18d50 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
18d60 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
18d70 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
18d80 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
18d90 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
18da0 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
18db0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
18dc0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
18dd0 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
18de0 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
18df0 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
18e00 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
18e10 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
18e20 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
18e30 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
18e40 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
18e50 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
18e60 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
18e70 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
18e80 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
18e90 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
18ea0 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
18eb0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
18ec0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
18ed0 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18ee0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18ef0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18f00 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
18f10 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
18f20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
18f30 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
18f40 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
18f50 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
18f60 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
18f70 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
18f80 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
18f90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
18fa0 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
18fb0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18fc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
18fd0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
18fe0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
18ff0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
19000 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
19010 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
19020 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
19030 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
19040 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
19050 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
19060 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
19070 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
19080 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
19090 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
190a0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
190b0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
190c0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
190d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
190e0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
190f0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
19100 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
19110 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
19120 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
19130 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
19140 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
19150 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
19160 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19170 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19180 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
19190 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
191a0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
191b0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
191c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
191d0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
191e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
191f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
19200 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
19210 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
19220 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
19230 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
19240 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
19250 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
19260 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
19270 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
19280 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
19290 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
192a0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
192b0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
192c0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
192d0 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
192e0 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
192f0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
19300 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
19310 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
19320 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
19330 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
19340 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
19350 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
19360 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
19370 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
19380 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
19390 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
193a0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
193b0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
193c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
193d0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
193e0 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
193f0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
19400 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
19410 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19420 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
19430 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
19440 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
19450 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
19460 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
19470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
19480 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
19490 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
194a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
194b0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
194c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
194d0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
194e0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
194f0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
19500 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
19510 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
19520 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
19530 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
19540 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
19550 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
19560 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
19570 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
19580 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
19590 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
195a0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
195b0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
195c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
195d0 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
195e0 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
195f0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19600 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
19610 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
19620 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
19630 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19640 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19650 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
19660 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
19670 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
19680 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
19690 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
196a0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
196b0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
196c0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
196d0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
196e0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
196f0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
19700 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
19710 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
19720 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
19730 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
19740 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
19750 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
19760 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
19770 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
19780 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
19790 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
197a0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
197b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
197c0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
197d0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
197e0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
197f0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
19800 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
19810 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
19820 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
19830 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
19840 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
19850 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
19860 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
19870 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
19880 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
19890 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
198a0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
198b0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
198c0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
198d0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
198e0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
198f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
19900 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
19910 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
19920 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
19930 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
19940 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
19950 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
19960 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
19970 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
19980 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
19990 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
199a0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
199b0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
199c0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
199d0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
199e0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
199f0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
19a00 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
19a10 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
19a20 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
19a30 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
19a40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19a50 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
19a60 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
19a70 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
19a80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19a90 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
19aa0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19ab0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
19ac0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19ad0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
19ae0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
19af0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
19b00 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
19b10 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
19b20 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
19b30 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45  oint );.  if( NE
19b40 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  VER(p->inTrans!=
19b50 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
19b60 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
19b70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19b80 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c  _INTERNAL;.  }el
19b90 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
19ba0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19bb0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
19bc0 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65  );.    /* At the
19bd0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
19be0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
19bf0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
19c00 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a  oint with.    **
19c10 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
19c20 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
19c30 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
19c40 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
19c50 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d     ** SQL statem
19c60 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
19c70 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
19c80 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
19c90 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
19ca0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
19cb0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
19cc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
19cd0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
19ce0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
19cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19d00 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
19d10 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
19d20 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
19d30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19d40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19d50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
19d60 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
19d70 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
19d80 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
19d90 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
19da0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
19db0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
19dc0 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
19dd0 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
19de0 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
19df0 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
19e00 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
19e10 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
19e20 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
19e30 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
19e40 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
19e50 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
19e60 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19e70 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
19e80 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
19e90 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
19ea0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
19eb0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
19ec0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
19ed0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
19ee0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
19ef0 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
19f00 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
19f10 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
19f20 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
19f30 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
19f40 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
19f50 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
19f60 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
19f70 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
19f80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19f90 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
19fa0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
19fb0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
19fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19fd0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
19fe0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19ff0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1a000 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a010 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1a020 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
1a030 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
1a040 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1a050 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
1a060 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
1a070 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
1a080 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
1a090 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
1a0a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1a0b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
1a0c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a0d0 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
1a0e0 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
1a0f0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
1a100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a110 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  {.      rc = new
1a120 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1a130 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a140 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a150 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a160 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1a170 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1a180 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1a190 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1a1a0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1a1b0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1a1c0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1a1d0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1a1e0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1a1f0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1a200 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1a210 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1a220 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1a230 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1a240 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1a250 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1a260 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1a270 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1a280 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1a290 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1a2a0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1a2b0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1a2c0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1a2d0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1a2e0 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1a2f0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1a300 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1a310 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1a320 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1a330 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1a340 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1a350 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1a360 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1a370 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1a380 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1a390 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1a3a0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1a3b0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1a3c0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1a3d0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1a3e0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1a3f0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1a400 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a410 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1a420 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1a430 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1a440 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1a450 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1a460 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1a470 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1a480 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1a490 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1a4a0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1a4b0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1a4c0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1a4d0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1a4e0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1a4f0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1a500 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1a510 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1a520 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a530 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1a540 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1a550 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1a560 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1a570 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1a580 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1a590 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1a5a0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1a5b0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1a5c0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1a5d0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1a5e0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1a5f0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1a600 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1a610 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1a620 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1a630 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1a640 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1a650 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1a660 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1a670 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74  CursorSize() byt
1a680 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a  es of memory .**
1a690 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
1a6a0 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65  Cur have been ze
1a6b0 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  roed by the call
1a6c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a6d0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1a6e0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1a710 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1a720 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1a750 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1a760 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1a790 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1a7a0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1a7b0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1a7c0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1a7d0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1a7e0 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1a7f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1a800 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1a830 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1a840 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a850 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1a860 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1a870 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1a880 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1a890 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1a8a0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1a8b0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a8c0 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1a8d0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1a8e0 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1a8f0 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1a900 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1a910 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1a920 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1a930 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1a940 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1a950 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1a960 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1a970 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1a980 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1a990 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1a9a0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1a9b0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1a9c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1a9d0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1a9e0 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1a9f0 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1aa00 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1aa10 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1aa20 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1aa30 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1aa40 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1aa50 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1aa60 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1aa70 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1aa80 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1aa90 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1aaa0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1aab0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1aac0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1aad0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1aae0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1aaf0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1ab00 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1ab10 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1ab20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
1ab30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ab40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1ab50 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1ab60 3d 31 20 26 26 20 70 61 67 65 72 50 61 67 65 63  =1 && pagerPagec
1ab70 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1ab80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ab90 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20  E_EMPTY;.  }..  
1aba0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1abb0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1abc0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1abd0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1abe0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1abf0 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1ac00 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1ac10 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1ac20 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1ac30 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1ac40 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1ac50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1ac60 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1ac70 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1ac80 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1ac90 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1aca0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1acb0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1acc0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1acd0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1ace0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1acf0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1ad00 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1ad10 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1ad20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1ad30 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1ad40 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1ad50 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1ad60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ad70 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1ad80 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1ad90 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1adc0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1add0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ae00 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1ae10 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1ae20 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1ae50 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1ae60 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1ae70 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1ae80 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1ae90 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1aea0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1aeb0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1aec0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1aef0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1af00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1af10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1af20 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1af30 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1af40 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1af50 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1af60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1af70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1af80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1af90 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1afa0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1afb0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1afc0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1afd0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1afe0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1aff0 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1b000 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1b010 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1b020 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1b030 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1b040 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1b050 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1b060 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1b070 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1b080 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1b090 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1b0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b0b0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1b0c0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69  id){.  return si
1b0d0 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a  zeof(BtCursor);.
1b0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1b0f0 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61   cached rowid va
1b100 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72  lue of every cur
1b110 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  sor in the same 
1b120 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1b130 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76   as pCur and hav
1b140 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ing the same roo
1b150 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  t page number as
1b160 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75   pCur.  The valu
1b170 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69  e is.** set to i
1b180 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  Rowid..**.** Onl
1b190 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  y positive rowid
1b1a0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1b1b0 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72  idered valid for
1b1c0 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20   this cache..** 
1b1d0 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69  The cache is ini
1b1e0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1b1f0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
1b200 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a  invalid cache..*
1b210 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77  * A btree will w
1b220 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65  ork fine with ze
1b230 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1b240 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20  owids.  We just 
1b250 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20  cannot.** cache 
1b260 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1b270 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d   rowids, which m
1b280 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74  eans tables that
1b290 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20   use zero or.** 
1b2a0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1b2b0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1b2c0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20  le slower.  But 
1b2d0 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72  in practice, zer
1b2e0 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65  o.** or negative
1b2f0 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79   rowids are very
1b300 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69   uncommon so thi
1b310 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
1b320 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
1b330 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
1b340 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1b350 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71  Cursor *pCur, sq
1b360 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
1b370 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  id){.  BtCursor 
1b380 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72  *p;.  for(p=pCur
1b390 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1b3a0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1b3b0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
1b3c0 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  oot==pCur->pgnoR
1b3d0 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52  oot ) p->cachedR
1b3e0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1b3f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1b400 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d  r->cachedRowid==
1b410 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a  iRowid );.}../*.
1b420 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61  ** Return the ca
1b430 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ched rowid for t
1b440 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e  he given cursor.
1b450 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20    A negative or 
1b460 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76  zero.** return v
1b470 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
1b480 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61  hat the rowid ca
1b490 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61  che is invalid a
1b4a0 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  nd should be.** 
1b4b0 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65  ignored.  If the
1b4c0 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73   rowid cache has
1b4d0 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1b4e0 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a  en set, then a.*
1b4f0 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * zero is return
1b500 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ed..*/.sqlite3_i
1b510 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
1b520 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1b530 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b540 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1b550 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a  cachedRowid;.}..
1b560 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1b570 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1b580 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1b590 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1b5a0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1b5b0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1b5c0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1b5d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1b5e0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1b5f0 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1b600 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1b610 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1b620 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1b630 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1b640 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1b650 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1b660 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1b670 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1b680 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1b690 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1b6a0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1b6b0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1b6c0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1b6d0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1b6e0 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1b6f0 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1b700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b710 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1b720 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1b730 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1b740 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1b750 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1b760 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1b770 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b780 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1b790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1b7a0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1b7b0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
1b7c0 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1b7d0 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
1b7e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1b7f0 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1b800 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1b810 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1b820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b830 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1b840 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1b850 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1b860 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1b870 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1b880 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1b890 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1b8a0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1b8b0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1b8c0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1b8d0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1b8e0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1b8f0 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1b900 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1b910 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1b920 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1b930 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1b940 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1b950 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1b960 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1b970 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1b980 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1b990 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1b9a0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1b9b0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1b9c0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1b9d0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1b9e0 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1b9f0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1ba00 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1ba10 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1ba20 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1ba30 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1ba40 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1ba50 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1ba60 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1ba70 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1ba80 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1ba90 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1baa0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1bab0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1bac0 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1bad0 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1bae0 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1baf0 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1bb00 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1bb10 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1bb20 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1bb30 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1bb40 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1bb50 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1bb60 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1bb70 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1bb80 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1bb90 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1bba0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1bbb0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1bbc0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1bbd0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1bbe0 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
1bbf0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1bc00 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1bc10 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1bc20 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1bc30 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1bc40 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1bc50 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1bc60 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1bc70 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1bc80 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1bc90 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1bca0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1bcb0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1bcc0 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1bcd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1bce0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1bcf0 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1bd00 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1bd10 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1bd20 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1bd30 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1bd40 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1bd50 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1bd60 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
1bd70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1bd80 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1bd90 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1bda0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1bdb0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1bdc0 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1bdd0 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1bde0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1bdf0 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1be00 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1be10 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1be50 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1be60 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bea0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1beb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1bf00 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1bf10 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1bf20 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1bf30 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
1bf40 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1bf50 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1bf90 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
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 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1bfe0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1bff0 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1c030 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1c040 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1c050 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1c060 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1c070 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1c080 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1c090 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1c0a0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1c0b0 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1c0c0 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1c0d0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1c0e0 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1c0f0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1c100 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1c110 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1c120 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1c130 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1c140 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1c150 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1c160 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1c170 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1c180 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1c190 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1c1a0 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1c1b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c1c0 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1c1d0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1c1e0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1c1f0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1c200 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1c210 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1c220 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1c230 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1c240 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1c250 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1c260 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1c270 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1c280 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1c290 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1c2a0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1c2b0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1c2c0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c2d0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1c2e0 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1c2f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1c300 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1c310 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1c320 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1c330 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1c340 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1c350 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1c360 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1c370 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1c380 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1c390 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1c3a0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1c3b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c3c0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1c3d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c3e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c3f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c400 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1c410 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1c420 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1c430 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1c440 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1c450 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1c460 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1c470 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1c480 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1c490 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1c4a0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1c4b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c4c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1c4d0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1c4e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1c4f0 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1c500 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1c510 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1c520 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1c530 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1c540 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1c550 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1c560 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1c570 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1c580 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c590 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1c5a0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1c5b0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1c5c0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1c5d0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1c5e0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1c5f0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1c600 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1c610 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1c620 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1c630 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1c640 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1c650 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1c660 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1c670 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1c680 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1c690 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1c6a0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1c6b0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1c6c0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1c6d0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1c6e0 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1c6f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1c700 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1c710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1c720 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c730 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1c740 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1c750 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1c760 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1c770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1c790 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1c7a0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1c7b0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1c7c0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1c7d0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1c7e0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1c7f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1c800 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1c810 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1c820 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1c830 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1c840 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1c850 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1c860 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1c870 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1c880 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1c890 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1c8a0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1c8b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c8c0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1c8d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c8e0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1c8f0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1c900 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1c910 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1c920 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1c930 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1c940 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1c950 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1c960 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1c970 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1c980 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1c990 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1c9a0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1c9b0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1c9c0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1c9d0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1c9e0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1c9f0 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1ca00 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1ca10 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1ca20 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1ca30 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1ca40 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1ca50 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1ca60 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1ca70 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1ca80 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1ca90 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1caa0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1cab0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1cac0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1cad0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1cae0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1caf0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1cb00 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1cb10 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1cb20 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1cb30 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1cb40 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1cb50 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1cb60 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1cb70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1cb80 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1cb90 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1cba0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1cbb0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1cbc0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1cbd0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1cbf0 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1cc00 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1cc10 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1cc20 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1cc30 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1cc40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1cc50 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1cc60 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1cc70 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1cc80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cc90 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1cca0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ccb0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1ccc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1ccd0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1cce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ccf0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1cd00 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1cd10 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1cd20 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1cd30 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1cd40 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1cd50 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1cd60 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1cd70 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1cd80 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1cd90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1cda0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1cdb0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1cdc0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1cdd0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1cde0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1cdf0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1ce00 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1ce10 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1ce20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1ce30 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1ce40 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1ce50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1ce60 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1ce70 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1ce80 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1ce90 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1cea0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1ceb0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1cec0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ced0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1cee0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1cef0 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
1cf00 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1cf10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1cf20 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1cf30 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1cf40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cf50 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1cf60 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1cf70 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1cf80 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1cf90 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1cfa0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1cfb0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1cfc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1cfd0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
1cfe0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
1cff0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
1d000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d010 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1d020 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1d030 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1d040 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1d050 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1d060 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d080 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1d090 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1d0a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1d0b0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1d0c0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1d0d0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1d0e0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1d0f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1d100 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1d110 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1d120 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1d130 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1d140 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1d150 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1d160 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1d170 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1d180 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1d190 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1d1a0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1d1b0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d1c0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1d1d0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1d1e0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1d1f0 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1d200 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1d210 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1d220 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1d230 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1d240 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1d250 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d260 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1d270 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1d280 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1d290 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1d2a0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1d2b0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1d2c0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1d2d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1d2e0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1d2f0 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1d300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d310 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1d320 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1d330 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d340 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1d350 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1d360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d370 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1d380 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1d390 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1d3a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d3b0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1d3c0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d3e0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1d3f0 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1d400 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1d410 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1d420 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1d430 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1d440 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1d450 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1d460 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1d470 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1d480 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1d490 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1d4a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d4b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1d4c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d4d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d4e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1d4f0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1d500 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1d510 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1d520 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1d530 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1d540 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1d550 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1d560 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1d570 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1d580 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d590 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d5a0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1d5b0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1d5c0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1d5d0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1d5e0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1d5f0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1d600 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1d610 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1d620 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1d630 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1d640 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1d650 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1d660 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1d670 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1d680 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1d690 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1d6a0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1d6b0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1d6c0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1d6d0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1d6e0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1d6f0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1d700 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1d710 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1d720 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1d730 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1d740 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1d750 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1d760 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1d770 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1d780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1d790 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1d7a0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1d7b0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1d7c0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1d7d0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1d7e0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1d7f0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1d800 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1d810 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1d820 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1d830 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1d840 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1d850 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1d860 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1d870 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1d880 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1d890 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1d8a0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1d8b0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1d8c0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1d8d0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1d8e0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1d8f0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1d900 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1d910 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1d920 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1d930 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1d940 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1d950 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1d960 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1d970 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1d980 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1d990 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1d9a0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1d9b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1d9c0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1d9d0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1d9e0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1d9f0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1da00 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1da10 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1da20 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1da30 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1da40 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1da50 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1da60 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1da70 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1da80 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1da90 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1daa0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1dab0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1dac0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1dad0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1dae0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1daf0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1db00 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1db10 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1db20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1db30 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1db40 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1db50 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1db60 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1db70 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1db80 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1db90 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1dba0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1dbb0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1dbc0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1dbd0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1dbe0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1dbf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dc00 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1dc10 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1dc20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1dc30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1dc40 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1dc50 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1dc60 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1dc70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1dc80 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1dc90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1dca0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1dcb0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1dcc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1dcd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1dce0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1dcf0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1dd00 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1dd10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1dd20 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1dd30 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1dd40 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1dd50 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1dd60 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1dd70 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1dd80 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1dd90 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1dda0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1ddb0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1ddc0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1ddd0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
1dde0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
1ddf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
1de00 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1de10 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1de20 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1de30 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1de40 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1de50 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1de60 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1de70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1de80 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1de90 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1dea0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1deb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1dec0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1ded0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1dee0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
1def0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
1df00 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
1df10 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1df20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
1df30 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
1df40 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
1df50 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
1df60 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
1df70 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
1df80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
1df90 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1dfa0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
1dfb0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
1dfc0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1dfd0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
1dfe0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1dff0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
1e000 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
1e010 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1e020 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
1e030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e040 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
1e050 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
1e060 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1e070 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
1e080 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
1e090 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
1e0a0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
1e0b0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1e0c0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
1e0d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e0e0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
1e0f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1e100 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
1e110 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
1e120 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
1e130 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
1e140 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
1e150 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
1e160 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
1e170 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
1e180 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
1e190 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
1e1a0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
1e1b0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1e1c0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1e1d0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
1e1e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
1e1f0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1e200 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1e210 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
1e220 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
1e230 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
1e240 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
1e250 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
1e260 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
1e270 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
1e280 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
1e290 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1e2a0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
1e2b0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
1e2c0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1e2d0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
1e2e0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
1e2f0 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
1e300 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
1e310 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
1e320 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
1e330 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
1e340 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1e350 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
1e360 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
1e370 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
1e380 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
1e390 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
1e3a0 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
1e3b0 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
1e3c0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
1e3d0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
1e3e0 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
1e3f0 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
1e400 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1e410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1e420 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
1e430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1e440 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1e450 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1e460 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
1e470 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
1e480 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1e490 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
1e4a0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
1e4b0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
1e4c0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
1e4d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1e4e0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1e4f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e500 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
1e510 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
1e520 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
1e530 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
1e540 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1e550 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
1e560 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
1e570 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
1e580 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e590 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
1e5a0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
1e5b0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
1e5c0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
1e5d0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1e5e0 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
1e5f0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
1e600 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1e610 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
1e620 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
1e630 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1e640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1e650 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1e660 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
1e670 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
1e680 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1e690 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1e6a0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
1e6b0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
1e6c0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1e6d0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1e6e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e6f0 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1e700 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1e710 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1e720 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1e730 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1e740 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e750 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1e760 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1e770 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1e780 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1e790 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1e7a0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1e7b0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1e7c0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1e7d0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1e7e0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1e7f0 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1e800 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1e810 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1e820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1e830 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1e840 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1e850 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1e860 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1e870 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1e880 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1e890 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1e8a0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
1e8b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1e8c0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
1e8d0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
1e8e0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
1e8f0 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
1e900 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
1e910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e920 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
1e930 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
1e940 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
1e950 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
1e960 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
1e970 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
1e980 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
1e990 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
1e9a0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
1e9b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
1e9c0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
1e9d0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
1e9e0 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
1e9f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1ea00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
1ea10 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
1ea20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ea30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ea40 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
1ea50 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
1ea60 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1ea70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
1ea80 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1ea90 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
1eaa0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
1eab0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
1eac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1ead0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
1eae0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
1eaf0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1eb00 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1eb10 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
1eb20 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1eb30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1eb40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1eb50 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1eb60 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
1eb70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1eb80 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
1eb90 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1eba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ebb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1ebc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ebd0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1ebe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ebf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1ec00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ec10 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1ec20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
1ec30 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1ec40 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1ec50 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1ec60 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1ec70 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1ec80 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1ec90 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1eca0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
1ecb0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1ecc0 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
1ecd0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
1ece0 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
1ecf0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
1ed00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1ed10 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
1ed20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1ed30 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1ed40 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
1ed50 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
1ed60 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
1ed70 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
1ed80 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
1ed90 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
1eda0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
1edb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1edc0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
1edd0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
1ede0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1edf0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ee00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ee10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ee20 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1ee30 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1ee40 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1ee50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1ee60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1ee70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ee80 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1ee90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1eea0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
1eeb0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
1eec0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1eed0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
1eee0 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
1eef0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1ef00 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
1ef10 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1ef20 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1ef30 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1ef40 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1ef50 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1ef60 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1ef70 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1ef80 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
1ef90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1efa0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
1efb0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
1efc0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
1efd0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
1efe0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
1eff0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
1f000 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
1f010 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
1f020 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
1f030 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
1f040 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1f050 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
1f060 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
1f070 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
1f080 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1f090 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
1f0a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f0b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1f0c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1f0d0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
1f0e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1f0f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f100 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1f110 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1f120 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1f130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1f150 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f160 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
1f170 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1f180 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1f190 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f1a0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
1f1b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f1c0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1f1d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f1e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1f1f0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
1f200 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1f210 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
1f220 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f230 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1f240 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f250 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1f260 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
1f270 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
1f280 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1f290 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
1f2a0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
1f2b0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1f2c0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
1f2d0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
1f2e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
1f2f0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
1f300 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
1f310 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
1f320 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
1f330 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
1f340 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
1f350 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
1f360 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
1f370 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
1f380 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
1f390 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
1f3a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f3b0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1f3c0 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
1f3d0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
1f3e0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
1f3f0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
1f400 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
1f410 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
1f420 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
1f430 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
1f440 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
1f450 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
1f460 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
1f470 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
1f480 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
1f490 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
1f4a0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
1f4b0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
1f4c0 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
1f4d0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
1f4e0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
1f4f0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
1f500 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
1f510 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
1f520 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
1f530 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
1f540 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
1f550 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
1f560 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
1f570 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
1f580 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1f590 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
1f5a0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
1f5b0 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
1f5c0 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
1f5d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1f5e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
1f5f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1f600 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
1f610 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1f620 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1f630 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1f640 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1f650 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
1f660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1f670 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1f680 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1f690 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
1f6a0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
1f6b0 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
1f6c0 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
1f6d0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
1f6e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1f6f0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
1f700 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1f710 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
1f720 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
1f730 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
1f740 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1f750 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f760 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
1f770 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f780 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1f7a0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f7b0 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
1f7c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1f7d0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1f7e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1f7f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1f800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1f810 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
1f820 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29  ->info.nSize==0)
1f830 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
1f840 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1f850 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f860 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
1f870 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1f890 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
1f8a0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1f8b0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
1f8c0 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
1f8d0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1f8e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1f8f0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
1f900 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
1f910 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
1f920 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1f930 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
1f940 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
1f950 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
1f960 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1f970 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
1f980 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
1f990 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1f9a0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
1f9b0 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d  assert( nLocal<=
1f9c0 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  nKey );.  }.  *p
1f9d0 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
1f9e0 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
1f9f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
1fa00 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
1fa10 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
1fa20 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
1fa30 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
1fa40 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
1fa50 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
1fa60 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
1fa70 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
1fa80 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
1fa90 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
1faa0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
1fab0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
1fac0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
1fad0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
1fae0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
1faf0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
1fb00 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
1fb10 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
1fb20 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
1fb30 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
1fb40 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
1fb50 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
1fb60 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
1fb70 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
1fb80 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
1fb90 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
1fba0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
1fbb0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
1fbc0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
1fbd0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
1fbe0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
1fbf0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
1fc00 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1fc10 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
1fc20 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
1fc30 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
1fc40 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1fc50 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
1fc60 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1fc70 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
1fc80 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
1fc90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1fca0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1fcb0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1fcc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1fcd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fce0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
1fcf0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
1fd00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
1fd10 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
1fd20 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1fd30 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1fd40 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1fd50 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n p;.}.const voi
1fd60 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1fd70 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1fd80 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1fd90 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
1fda0 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
1fdb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1fdc0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1fdd0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1fde0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1fdf0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fe00 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
1fe10 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
1fe20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
1fe30 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
1fe40 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1fe50 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1fe60 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1fe70 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n p;.}.../*.** M
1fe80 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1fe90 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1fea0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1feb0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1fec0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1fed0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1fee0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1fef0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
1ff00 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
1ff10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1ff20 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
1ff30 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
1ff40 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
1ff50 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
1ff60 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
1ff70 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
1ff80 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
1ff90 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
1ffa0 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
1ffb0 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
1ffc0 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
1ffd0 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
1ffe0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1fff0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
20000 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
20010 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
20020 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
20030 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
20040 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
20050 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20060 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
20070 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20080 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20090 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
200a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
200b0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
200c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
200d0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
200e0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
200f0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
20100 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
20110 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20120 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20130 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
20140 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
20150 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
20160 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
20170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
20180 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
20190 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
201a0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
201b0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
201c0 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
201d0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
201e0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
201f0 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
20200 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
20210 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
20220 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
20230 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20250 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
20260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20270 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
20280 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
20290 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
202a0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
202b0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
202c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
202d0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
202e0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
202f0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
20300 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
20310 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
20320 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
20330 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
20340 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
20350 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
20360 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
20370 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
20380 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
20390 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
203a0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
203b0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
203c0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
203d0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
203e0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
203f0 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
20400 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
20410 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
20420 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
20430 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
20440 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
20450 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
20460 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
20470 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
20480 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
20490 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
204a0 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
204b0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
204c0 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
204d0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
204e0 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
204f0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
20500 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
20510 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
20520 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
20530 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
20540 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
20550 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
20560 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
20570 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
20580 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
20590 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
205a0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
205b0 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
205c0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
205d0 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
205e0 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
205f0 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
20600 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
20610 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
20620 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
20630 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20640 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
20650 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
20660 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20680 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
20690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
206a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
206b0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
206c0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
206d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
206e0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
206f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20700 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
20710 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
20720 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
20730 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
20740 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
20750 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
20760 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
20770 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
20780 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
20790 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
207a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
207b0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
207c0 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
207d0 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
207e0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
207f0 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
20800 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
20810 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
20820 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
20830 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
20840 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
20850 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
20860 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
20870 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
20880 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
20890 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
208a0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
208b0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
208c0 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
208d0 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
208e0 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
208f0 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
20900 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
20910 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
20920 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
20930 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
20940 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
20950 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
20960 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
20970 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
20980 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
20990 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
209a0 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
209b0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
209c0 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
209d0 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
209e0 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
209f0 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
20a00 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
20a10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20a20 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
20a30 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
20a40 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
20a50 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
20a60 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
20a70 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
20a80 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
20a90 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
20aa0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
20ab0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
20ac0 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
20ad0 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
20ae0 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
20af0 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
20b00 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
20b10 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
20b20 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
20b30 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
20b40 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
20b50 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
20b60 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
20b70 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
20b80 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
20b90 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
20ba0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
20bb0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
20bc0 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
20bd0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
20be0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
20bf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
20c00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20c10 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
20c20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
20c30 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
20c40 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
20c50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20c60 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20c70 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
20c80 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
20c90 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
20ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
20cb0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
20cc0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
20cd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
20ce0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
20cf0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20d00 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
20d10 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
20d20 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
20d30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
20d40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
20d50 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
20d60 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
20d70 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
20d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
20d90 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
20da0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
20db0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
20dc0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
20dd0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
20de0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
20df0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
20e00 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
20e10 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20e20 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
20e30 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i]);.    }.    p
20e40 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
20e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20e60 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
20e70 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
20e80 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
20e90 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  age[0]);.    if(
20ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20eb0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
20ec0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
20ed0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
20ee0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20ef0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
20f00 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  0;..    /* If pC
20f10 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
20f20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
20f30 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
20f40 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
20f50 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65  r.    ** expecte
20f60 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
20f70 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
20f80 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
20f90 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a  KeyInfo is.    *
20fa0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
20fb0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
20fc0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
20fd0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
20fe0 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  se,.    ** retur
20ff0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
21000 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20  UPT error.  */. 
21010 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
21020 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
21030 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61  ey==1 || pCur->a
21040 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
21050 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
21060 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
21070 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  0)!=pCur->apPage
21080 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
21090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
210a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
210b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
210c0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
210d0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66   root page is of
210e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
210f0 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  e. This must be 
21100 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73  the.  ** case as
21110 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   the call to thi
21120 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
21130 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d  loaded the root-
21140 70 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a  page (either.  *
21150 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61  * this call or a
21160 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61   previous invoca
21170 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65  tion) would have
21180 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
21190 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68  tion .  ** if th
211a0 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72  e assumption wer
211b0 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
211c0 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
211d0 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73  le for the flags
211e0 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68   .  ** byte to h
211f0 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
21200 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72  d while this cur
21210 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  sor is holding a
21220 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20   reference.  ** 
21230 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f  to the page.  */
21240 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
21250 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
21260 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
21270 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
21280 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
21290 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20  Root->isInit && 
212a0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
212b0 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)==pRoot->intK
212c0 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61  ey );..  pCur->a
212d0 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
212e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
212f0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
21300 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
21310 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
21320 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
21330 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
21340 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
21350 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
21360 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
21370 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
21380 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
21390 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
213a0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
213b0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
213c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
213d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
213e0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
213f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
21400 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
21410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
21420 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
21430 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
21440 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
21450 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
21460 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21470 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
21480 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
21490 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
214a0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
214b0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
214c0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
214d0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
214e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
214f0 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
21500 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
21510 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
21520 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
21530 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
21540 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
21550 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
21560 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
21570 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
21580 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21590 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
215a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
215b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
215c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
215d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
215e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
215f0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21600 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
21610 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21620 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
21630 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
21640 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
21650 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
21660 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
21670 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
21680 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
21690 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
216a0 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
216b0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
216c0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
216d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
216e0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
216f0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
21700 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
21710 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
21720 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
21730 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
21740 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
21750 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
21760 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
21770 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
21780 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
21790 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
217a0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
217b0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
217c0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
217d0 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
217e0 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
217f0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
21800 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
21810 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
21820 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
21830 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
21840 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
21850 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
21860 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
21870 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
21880 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
21890 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
218a0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
218b0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
218c0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
218d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
218e0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
218f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21900 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21910 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21920 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21930 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
21940 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21950 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
21960 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21970 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
21980 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
21990 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
219a0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
219b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
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 3b 0a 20 20 20 20  age->nCell;.    
219f0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
21a00 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
21a10 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
21a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
21a30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21a40 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
21a50 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
21a60 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
21a70 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
21a80 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
21a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21aa0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
21ab0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
21ac0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
21ad0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
21ae0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
21af0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
21b00 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
21b10 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
21b20 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
21b30 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
21b40 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
21b50 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
21b60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
21b70 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
21b80 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
21b90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
21ba0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21bb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21bc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21bd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
21be0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
21bf0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
21c00 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
21c10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21c30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21c40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
21c50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21c60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21c70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
21c80 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
21c90 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
21ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
21cc0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21cd0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21ce0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
21cf0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
21d00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
21d10 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
21d20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21d30 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
21d40 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
21d50 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
21d60 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
21d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
21d80 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
21d90 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
21da0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
21db0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
21dc0 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
21dd0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
21de0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
21df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21e00 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
21e10 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21e20 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
21e30 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
21e40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21e50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21e70 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
21e80 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
21e90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
21ea0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
21eb0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
21ec0 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
21ed0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
21ee0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
21ef0 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75  r->eState && pCu
21f00 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66  r->atLast ){.#if
21f10 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21f20 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
21f30 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
21f40 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
21f50 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
21f60 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
21f70 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
21f80 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
21f90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
21fa0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
21fb0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
21fc0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
21fd0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
21fe0 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
21ff0 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
22000 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22010 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22020 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
22030 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22040 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
22050 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22060 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22070 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
22080 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
22090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
220a0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
220b0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
220c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
220d0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
220e0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
220f0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
22100 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22110 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22120 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
22130 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
22140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22150 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22160 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22170 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
22180 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
22190 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
221a0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
221b0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
221c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
221d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
221e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
221f0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22200 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
22210 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
22220 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
22230 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
22240 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
22250 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
22260 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
22270 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
22280 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
22290 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
222a0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
222b0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
222c0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
222d0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
222e0 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
222f0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
22300 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
22310 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
22320 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
22330 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
22340 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
22350 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
22360 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
22370 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
22380 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
22390 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
223a0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
223b0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
223c0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
223d0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
223e0 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
223f0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
22400 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
22410 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
22420 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
22430 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
22440 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
22450 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
22460 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
22470 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
22480 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
22490 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
224a0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
224b0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
224c0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
224d0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
224e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
224f0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
22500 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
22510 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
22520 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
22530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22540 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
22550 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
22560 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
22570 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
22580 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
22590 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
225a0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
225b0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
225c0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
225d0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
225e0 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
225f0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
22600 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
22610 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
22620 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
22630 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22640 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
22650 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
22660 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
22670 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
22680 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
22690 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
226a0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
226b0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
226c0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
226d0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
226e0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
226f0 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
22700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22710 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
22720 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
22730 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
22740 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
22750 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
22760 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
22770 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
22780 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22790 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
227a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
227b0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
227c0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
227d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
227e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
227f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22800 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
22820 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
22830 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
22840 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
22850 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
22860 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
22870 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
22880 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
22890 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
228a0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
228b0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
228c0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
228d0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
228e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
228f0 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
22900 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20  alidNKey .   && 
22910 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
22920 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
22930 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
22940 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
22950 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
22960 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22980 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
22990 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
229a0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
229b0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
229c0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
229d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
229e0 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  }.  }..  rc = mo
229f0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
22a00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22a20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22a30 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22a40 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
22a50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22a60 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
22a70 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
22a80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22a90 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
22aa0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
22ab0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
22ac0 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
22ad0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22ae0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
22af0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
22b00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22b10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22b20 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
22b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22b40 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
22b50 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
22b60 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
22b70 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
22b80 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
22b90 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
22ba0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
22bb0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
22bc0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22bd0 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b  age];.    int c;
22be0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
22bf0 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
22c00 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
22c10 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
22c20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
22c30 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
22c40 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
22c50 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
22c60 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
22c70 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
22c80 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
22c90 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
22ca0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
22cb0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
22cc0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
22cd0 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
22ce0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
22cf0 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
22d00 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
22d10 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
22d20 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
22d30 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
22d40 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
22d50 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
22d60 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
22d70 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
22d80 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
22d90 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
22da0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
22db0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
22dc0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
22dd0 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
22de0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
22df0 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
22e00 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
22e10 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
22e20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
22e30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
22e40 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c  u16)upr;.    }el
22e50 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
22e60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22e70 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b  e] = (u16)((upr+
22e80 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
22e90 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
22ea0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
22eb0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22ec0 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f  age]; /* Index o
22ed0 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  f current cell i
22ee0 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20  n pPage */.     
22ef0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22f20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
22f30 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
22f40 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
22f50 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
22f60 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
22f70 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
22f80 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
22f90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e;.      if( pPa
22fa0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
22fb0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
22fc0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
22fd0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
22fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
22ff0 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
23000 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
23010 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
23020 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
23030 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
23040 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
23050 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
23060 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
23070 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
23080 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
23090 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
230a0 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
230b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
230c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
230d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
230e0 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
230f0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
23100 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
23110 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  }.        pCur->
23120 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
23130 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
23140 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
23150 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
23160 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
23170 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
23180 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32   page-size is 32
23190 37 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20  768 bytes. This 
231a0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
231b0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
231c0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
231d0 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
231e0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
231f0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
23200 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31  ge is at most 81
23210 39 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  98 bytes, which 
23220 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
23230 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
23240 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
23250 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
23260 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
23270 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
23280 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
23290 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
232a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
232b0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
232c0 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
232d0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
232e0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
232f0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
23300 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
23310 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
23320 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
23330 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
23340 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
23350 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
23360 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e  .        if( !(n
23370 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20  Cell & 0x80) && 
23380 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
23390 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
233a0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
233b0 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
233c0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
233d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
233e0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
233f0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
23400 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
23410 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
23420 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
23430 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
23440 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
23450 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
23460 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
23470 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
23480 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
23490 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
234a0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
234b0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
234c0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
234d0 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
234e0 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
234f0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
23500 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23510 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
23520 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
23530 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
23540 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
23550 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
23560 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
23570 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
23580 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
23590 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
235a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
235b0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
235c0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
235d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
235e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
235f0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
23600 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
23610 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
23620 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
23630 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
23640 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
23650 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
23660 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
23670 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
23680 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
23690 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
236a0 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
236b0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
236c0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
236d0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
236e0 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
236f0 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
23700 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
23710 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
23720 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
23730 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
23740 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
23750 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
23760 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
23770 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
23780 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
23790 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
237a0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
237b0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
237c0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
237d0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
237e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
237f0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
23800 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23810 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23820 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
23830 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
23840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23850 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
23860 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
23870 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
23880 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
23890 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
238a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
238b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
238c0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
238d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
238e0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
238f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23900 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
23910 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23920 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
23930 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
23940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
23950 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
23960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23970 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
23980 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
23990 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
239a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
239b0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
239c0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
239d0 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
239e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
239f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23a00 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
23a10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
23a20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23a30 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
23a40 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
23a50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23a60 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
23a70 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
23a80 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
23a90 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
23aa0 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
23ab0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
23ac0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
23ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23ae0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23af0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
23b00 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20  (lwr+upr)/2);.  
23b10 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23b20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20  lwr==upr+1 );.  
23b30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23b40 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
23b50 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
23b60 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
23b70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
23b80 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
23b90 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
23ba0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
23bb0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
23bc0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
23bd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
23be0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
23bf0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
23c00 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
23c10 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
23c20 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
23c30 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
23c40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
23c50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23c60 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
23c70 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
23c80 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
23c90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
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 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
23cc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23cd0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
23ce0 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
23cf0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
23d00 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23d10 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
23d20 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
23d30 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
23d40 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
23d50 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
23d60 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
23d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
23d80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
23d90 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
23da0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
23db0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
23dc0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
23dd0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
23de0 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
23df0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
23e00 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
23e10 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
23e20 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
23e30 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
23e40 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
23e50 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
23e60 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
23e70 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
23e80 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
23e90 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
23ea0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
23eb0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
23ec0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
23ed0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
23ee0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
23ef0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
23f00 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
23f10 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
23f20 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
23f30 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
23f40 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
23f50 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
23f60 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
23f70 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
23f80 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
23f90 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
23fa0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
23fb0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
23fc0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
23fd0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
23fe0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
23ff0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
24000 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
24010 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
24020 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
24030 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
24040 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
24050 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
24060 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
24070 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
24080 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
24090 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
240a0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
240b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
240c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
240d0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
240e0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
240f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24100 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24110 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
24120 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
24130 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
24150 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
24160 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
24170 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
24180 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
24190 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
241a0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
241b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
241c0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
241d0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43  Next>0 ){.    pC
241e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
241f0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
24200 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24210 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
24220 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
24230 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
24240 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24250 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
24260 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
24270 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
24280 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
24290 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
242a0 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx<=pPage->nCel
242b0 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  l );..  pCur->in
242c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
242d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
242e0 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d  = 0;.  if( idx>=
242f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
24300 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
24310 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
24320 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
24330 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
24340 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
24350 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
24360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
24370 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
24380 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
24390 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
243a0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
243b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
243c0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
243d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
243e0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
243f0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
24400 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
24410 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
24420 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
24430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24440 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
24450 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
24460 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
24470 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24480 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
24490 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
244a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
244b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
244c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
244d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
244e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
244f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
24500 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
24510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24530 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
24540 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
24550 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
24560 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
24570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24580 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
24590 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
245a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
245b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
245c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
245d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
245e0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
245f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
24600 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
24610 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
24620 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
24630 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
24640 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
24650 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
24660 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
24670 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
24680 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
24690 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
246a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
246b0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
246c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
246d0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
246e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
246f0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
24700 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24710 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
24720 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
24730 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
24740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24750 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
24760 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
24770 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
24780 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
24790 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
247a0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
247b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
247c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
247d0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
247e0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
247f0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
24800 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
24810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24820 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
24830 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
24840 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24850 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24860 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24870 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
24880 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
24890 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
248a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
248b0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
248c0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
248d0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
248e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
248f0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
24900 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24910 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
24920 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
24930 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
24940 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
24950 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24960 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
24970 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
24980 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
24990 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
249a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
249b0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
249c0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
249d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
249e0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
249f0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
24a00 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
24a10 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24a20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
24a30 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
24a40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24a50 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
24a60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24a70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24a80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
24a90 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
24aa0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24ac0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
24ad0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
24ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
24af0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24b00 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
24b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24b20 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
24b30 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
24b40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
24b50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
24b60 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
24b70 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
24b80 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
24b90 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
24ba0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
24bb0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
24bc0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
24bd0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
24be0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
24bf0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
24c00 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
24c10 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
24c20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
24c30 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
24c40 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
24c50 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
24c60 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
24c70 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
24c80 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
24c90 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
24ca0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
24cb0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
24cc0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
24cd0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
24ce0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
24cf0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
24d00 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
24d10 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
24d20 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
24d30 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
24d40 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
24d50 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
24d60 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
24d70 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
24d80 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
24d90 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
24da0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
24db0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
24dc0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
24dd0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
24de0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
24df0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
24e00 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
24e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
24e20 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
24e30 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
24e40 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
24e50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
24e60 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
24e70 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
24e80 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
24e90 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
24ea0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
24eb0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
24ec0 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
24ed0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
24ee0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
24ef0 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
24f00 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
24f10 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
24f20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
24f30 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
24f40 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
24f50 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
24f60 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
24f70 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
24f80 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
24f90 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
24fa0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
24fb0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
24fc0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
24fd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
24fe0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
24ff0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
25000 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
25010 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
25020 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
25030 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
25040 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
25050 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
25060 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
25070 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
25080 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
25090 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
250a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
250b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
250c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
250d0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
250e0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61  1;.  mxPage = pa
250f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
25100 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
25110 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
25120 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
25130 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
25140 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
25150 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
25160 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25170 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
25180 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
25190 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
251a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
251b0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
251c0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
251d0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
251e0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
251f0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
25200 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
25210 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
25220 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
25230 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
25240 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
25250 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
25260 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
25270 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
25280 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
25290 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
252a0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
252b0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
252c0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
252d0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
252e0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
252f0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
25300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25310 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
25320 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
25330 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
25340 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
25350 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
25360 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
25370 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
25380 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
25390 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
253a0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
253b0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
253c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
253d0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
253e0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
253f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
25400 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
25410 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
25420 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
25430 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
25440 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
25450 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
25460 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
25470 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
25480 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
25490 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
254a0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
254b0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
254c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
254d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
254e0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
254f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
25500 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
25510 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
25520 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
25530 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
25540 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
25550 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
25560 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
25570 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
25580 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
25590 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
255a0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
255b0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
255c0 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
255d0 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
255e0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
255f0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
25600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
25610 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
25620 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
25630 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
25640 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
25650 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
25660 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
25670 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
25680 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
25690 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
256a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
256b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
256c0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
256d0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
256e0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
256f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
25700 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25710 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
25720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
25730 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
25740 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
25750 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
25760 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
25770 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
25780 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
25790 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
257a0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  page;.      }.. 
257b0 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74       k = get4byt
257c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
257d0 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [4]);.      if( 
257e0 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
257f0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
25800 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
25810 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
25820 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
25830 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
25840 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
25850 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
25860 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
25870 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
25880 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
25890 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
258a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
258b0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
258c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
258d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
258e0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
258f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25900 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
25910 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25920 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
25930 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
25940 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
25950 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
25960 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
25970 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
25980 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
25990 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
259a0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
259b0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
259c0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
259d0 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
259e0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
259f0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
25a00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
25a10 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
25a20 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
25a30 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
25a40 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
25a50 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
25a60 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
25a70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25a80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25a90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25aa0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25ab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25ac0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25ad0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
25ae0 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
25af0 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
25b00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
25b10 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
25b20 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
25b30 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
25b40 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
25b50 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
25b60 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
25b70 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
25b80 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25b90 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
25ba0 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
25bb0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
25bc0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
25bd0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
25be0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
25bf0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25c00 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
25c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
25c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
25c30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25c40 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
25c50 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
25c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
25c70 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
25c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
25c90 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
25ca0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
25cb0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
25cc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
25ce0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
25cf0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
25d00 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
25d10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25d20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25d30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
25d40 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
25d50 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
25d60 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
25d70 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
25d80 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
25d90 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
25da0 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
25db0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
25dc0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
25dd0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
25de0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25df0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
25e00 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
25e10 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
25e20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
25e30 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
25e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
25e50 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
25e60 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
25e70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25e80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
25e90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25ea0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25ec0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
25ed0 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
25ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
25ef0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
25f00 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
25f10 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
25f20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
25f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25f40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25f50 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25f60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25f70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25f80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
25f90 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
25fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25fb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
25fd0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
25fe0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
25ff0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
26000 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
26010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26020 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
26030 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
26040 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
26050 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
26060 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
26070 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
26080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
26090 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
260a0 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
260b0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
260c0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
260d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
260e0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
260f0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
26100 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
26110 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26120 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26130 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
26140 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
26150 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
26160 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
26170 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
26180 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26190 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
261a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
261b0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
261c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
261d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
261e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
261f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26200 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26210 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
26220 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
26230 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
26240 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
26250 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26260 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
26270 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
26280 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
26290 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
262a0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
262b0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
262c0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
262d0 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
262e0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
262f0 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
26300 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
26310 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
26320 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
26330 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
26340 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
26350 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
26360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26370 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
26380 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
26390 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
263a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
263b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
263c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
263d0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
263e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
263f0 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
26400 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
26410 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
26420 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
26430 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
26440 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
26450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
26460 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
26470 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
26480 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
26490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
264a0 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
264b0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
264c0 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
264d0 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
264e0 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
264f0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
26500 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
26510 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
26520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
26530 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
26540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26550 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
26560 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
26570 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
26580 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
26590 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
265a0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
265b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
265c0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
265d0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
265e0 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
265f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
26600 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
26610 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
26620 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
26630 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
26640 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
26650 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
26660 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
26670 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
26680 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
26690 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
266a0 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
266b0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
266c0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54  age;.          T
266d0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
266e0 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20   %d was leaf %d 
266f0 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25  of %d on trunk %
26700 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d".             
26710 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66      ": %d more f
26720 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20  ree pages\n",.  
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
26740 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31  pPgno, closest+1
26750 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  , k, pTrunk->pgn
26760 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
26770 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
26780 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
26790 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
267a0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
267b0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
267c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
267d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
267e0 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
267f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
26800 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
26810 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75  Iswriteable(pTru
26820 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nk->pDbPage) );.
26830 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74            noCont
26840 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48  ent = !btreeGetH
26850 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a  asContent(pBt, *
26860 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  pPgno);.        
26870 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
26880 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
26890 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
268a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
268b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
268c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
268d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
268e0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
268f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
26900 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26920 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
26930 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
26940 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26950 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26960 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
26970 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
26980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
26990 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
269a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
269b0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
269c0 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
269d0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
269e0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
269f0 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
26a00 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65  freelist, so cre
26a10 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61  ate a new page a
26a20 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64  t the.    ** end
26a30 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   of the file */.
26a40 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
26a50 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
26a60 42 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  Bt);.    *pPgno 
26a70 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20  = nPage + 1;..  
26a80 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
26a90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26aa0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a  pBt) ){.      (*
26ab0 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a  pPgno)++;.    }.
26ac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26ad0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26ae0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
26af0 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
26b00 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70  P_ISPAGE(pBt, *p
26b10 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f  Pgno) ){.      /
26b20 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
26b30 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
26b40 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
26b50 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
26b60 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
26b70 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
26b80 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
26b90 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
26ba0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
26bb0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
26bc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
26bd0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
26be0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
26bf0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
26c00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
26c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
26c20 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
26c30 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
26c40 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
26c50 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
26c60 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26c70 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
26c80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
26c90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
26ca0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
26cb0 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29  *pPgno, &pPg, 0)
26cc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
26cd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26ce0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26cf0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
26d00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26d10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26d20 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
26d30 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
26d40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28 2a 70  rn rc;.      (*p
26d50 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
26d60 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
26d70 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
26d80 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
26d90 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
26da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
26db0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
26dc0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
26dd0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26de0 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
26df0 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
26e00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
26e10 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
26e20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
26e30 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
26e40 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
26e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26e60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26e70 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
26e80 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
26e90 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
26ea0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
26eb0 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
26ec0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
26ed0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
26ee0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
26ef0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
26f00 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
26f10 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
26f20 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
26f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
26f50 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
26f60 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
26f70 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
26f80 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
26f90 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
26fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26fb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26fc0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
26fd0 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
26fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
26ff0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
27000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27010 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
27020 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
27030 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
27040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27050 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
27060 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
27070 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
27080 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
27090 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
270a0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
270b0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
270c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
270d0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
270e0 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
270f0 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
27100 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
27110 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
27120 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
27130 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
27140 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
27150 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
27160 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
27170 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
27180 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
27190 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
271a0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
271b0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
271c0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
271d0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
271e0 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
271f0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
27200 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
27210 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
27220 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
27230 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
27240 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
27250 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
27260 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
27270 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
27280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
27290 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
272a0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
272b0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
272c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
272d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
272e0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
272f0 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
27300 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
27310 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
27320 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
27330 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
27340 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27360 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
27370 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
27380 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
27390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
273b0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
273c0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
273d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273e0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
273f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
27400 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
27410 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
27420 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27430 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
27440 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
27450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
27460 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
27470 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
27480 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
27490 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
274a0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
274b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
274c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
274d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
274e0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
274f0 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
27500 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
27510 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
27520 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
27530 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
27540 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27550 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
27560 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
27570 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
27580 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
27590 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
275a0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
275b0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
275c0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
275d0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
275e0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
275f0 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
27600 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
27610 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
27620 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
27630 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
27640 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
27650 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
27660 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
27670 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50  .  */.  if( (!pP
27680 61 67 65 20 26 26 20 28 72 63 20 3d 20 62 74 72  age && (rc = btr
27690 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
276a0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
276b0 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20  )).   ||        
276c0 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
276d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
276e0 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29  e->pDbPage)).  )
276f0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
27700 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d  age_out;.  }.  m
27710 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
27720 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
27730 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
27740 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
27750 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
27760 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
27770 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
27780 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
27790 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
277a0 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
277b0 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
277c0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
277d0 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
277e0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
277f0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
27800 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
27810 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
27820 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
27830 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
27840 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
27850 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
27860 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
27870 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
27880 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
27890 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
278a0 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
278b0 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
278c0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
278d0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
278e0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
278f0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
27900 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
27910 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
27920 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
27930 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
27940 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
27950 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
27960 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
27970 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
27980 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
27990 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
279a0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
279b0 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
279c0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
279d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
279e0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
279f0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
27a00 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
27a10 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
27a20 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
27a30 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
27a40 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
27a50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
27a60 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
27a70 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
27a80 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
27a90 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
27aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ab0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
27ac0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
27ad0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
27ae0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
27af0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
27b00 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
27b10 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
27b20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
27b30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
27b40 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
27b50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
27b60 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
27b70 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
27b80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
27b90 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
27ba0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
27bb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
27bc0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
27bd0 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
27be0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
27bf0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
27c00 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
27c10 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
27c20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
27c30 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
27c40 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
27c50 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
27c60 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
27c70 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
27c80 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
27c90 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
27ca0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
27cb0 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
27cc0 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
27cd0 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
27ce0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
27cf0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
27d00 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
27d10 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
27d20 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
27d30 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
27d40 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
27d50 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
27d60 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
27d70 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
27d80 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
27d90 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
27da0 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
27db0 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
27dc0 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
27dd0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
27de0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
27df0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
27e00 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
27e10 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
27e20 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
27e30 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
27e40 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
27e50 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
27e60 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
27e70 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
27e80 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
27e90 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
27ea0 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
27eb0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
27ec0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
27ed0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
27ee0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
27ef0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
27f00 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
27f10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27f20 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
27f30 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
27f40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27f50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27f60 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
27f70 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
27f80 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
27f90 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
27fa0 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
27fb0 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ], iPage);.#ifnd
27fc0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
27fd0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
27fe0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
27ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
28000 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
28010 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28020 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
28030 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
28040 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
28050 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
28060 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
28070 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
28080 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
28090 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
280a0 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
280b0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
280c0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
280d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
280e0 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
280f0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
28100 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
28110 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
28120 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
28130 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
28140 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
28150 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
28160 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
28170 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
28180 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
28190 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
281a0 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
281b0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
281c0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
281d0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
281e0 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
281f0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
28200 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
28210 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
28220 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
28230 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
28240 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
28250 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
28260 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
28270 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
28280 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
28290 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
282a0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
282b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
282c0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
282d0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
282e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
282f0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
28300 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
28310 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
28320 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
28330 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
28340 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
28350 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
28360 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
28370 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
28380 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
28390 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
283a0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
283b0 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
283c0 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
283d0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
283e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
283f0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
28400 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
28410 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
28420 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
28430 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
28440 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
28450 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
28460 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
28470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28480 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
28490 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
284a0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
284b0 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
284c0 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
284d0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
284e0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
284f0 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
28500 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
28510 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
28520 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
28530 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
28540 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
28550 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
28560 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
28570 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
28580 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
28590 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69    u16 ovflPageSi
285a0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
285b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
285c0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
285d0 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
285e0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
285f0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
28600 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
28610 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
28620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28630 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
28640 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
28650 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
28660 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
28670 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
28680 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
28690 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
286a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
286b0 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
286c0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
286d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
286e0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
286f0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
28700 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
28710 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
28720 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
28730 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
28740 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
28750 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
28760 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
28770 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
28780 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
28790 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
287a0 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
287b0 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
287c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
287d0 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
287e0 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
287f0 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
28800 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
28810 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
28820 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
28830 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
28840 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
28850 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
28860 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
28870 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
28880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28890 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
288a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
288b0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
288c0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
288d0 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
288e0 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
288f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
28900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28910 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  }.    rc = freeP
28920 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
28930 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
28940 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
28950 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28960 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
28970 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
28980 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28990 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
289a0 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
289b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
289c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
289d0 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
289e0 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
289f0 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
28a00 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
28a10 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
28a20 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
28a30 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
28a40 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
28a50 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
28a60 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
28a70 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
28a80 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
28a90 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
28aa0 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
28ab0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
28ac0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
28ad0 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
28ae0 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
28af0 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
28b00 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
28b10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28b20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
28b30 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
28b40 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
28b50 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
28b60 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
28b70 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
28b80 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
28b90 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
28ba0 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
28bb0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
28bc0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
28bd0 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
28be0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
28c10 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
28c20 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
28c30 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
28c40 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
28c50 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
28c60 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
28c70 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
28c80 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
28c90 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
28ca0 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
28cb0 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
28cc0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
28cd0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
28ce0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
28cf0 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
28d00 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
28d10 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
28d40 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
28d50 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
28d60 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
28d70 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
28d80 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
28d90 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
28da0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
28db0 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
28dc0 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
28dd0 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
28de0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
28df0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
28e00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
28e10 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
28e20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
28e30 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
28e40 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
28e50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28e60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
28e70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
28e80 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
28e90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
28ea0 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
28eb0 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
28ec0 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
28ed0 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
28ee0 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
28ef0 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
28f00 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
28f10 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
28f20 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
28f30 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
28f40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
28f50 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
28f60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28f70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
28f80 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
28f90 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
28fa0 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
28fb0 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
28fc0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
28fd0 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
28fe0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
28ff0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
29000 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
29010 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
29020 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
29030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
29040 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
29050 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
29060 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
29070 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
29080 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74  64*)&nKey);.  bt
29090 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
290a0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
290b0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
290c0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
290d0 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
290e0 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
290f0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
29100 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
29110 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
29120 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
29130 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
29140 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
29150 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
29160 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
29170 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
29180 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
29190 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
291a0 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
291b0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e  .    if( NEVER(n
291c0 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c  Key>0x7fffffff |
291d0 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20  | pKey==0) ){.  
291e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
291f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29200 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
29210 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  ad += (int)nKey;
29220 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
29230 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
29240 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  t)nKey;.  }.  *p
29250 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
29260 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
29270 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
29280 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
29290 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
292a0 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
292b0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
292c0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
292d0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
292e0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
292f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29300 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29310 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
29320 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
29330 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
29340 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
29350 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
29360 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
29370 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
29380 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
29390 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
293a0 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
293b0 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
293c0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
293d0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
293e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
293f0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
29400 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
29410 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
29420 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
29430 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
29440 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
29450 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
29460 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
29470 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
29480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
29490 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
294a0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
294b0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
294c0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
294d0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
294e0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
294f0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
29500 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
29510 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
29520 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
29530 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
29540 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
29550 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
29560 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
29570 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
29580 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
29590 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
295a0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
295b0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
295c0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
295d0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
295e0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
295f0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
29600 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
29610 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
29620 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
29630 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
29640 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
29650 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
29660 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
29670 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
29680 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
29690 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
296a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
296b0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
296c0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
296d0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
296e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
296f0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
29700 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
29710 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
29720 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
29730 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
29740 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29750 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
29760 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
29770 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
29780 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
29790 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
297a0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
297b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
297c0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
297d0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
297e0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
297f0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
29800 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
29810 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
29820 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
29830 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
29840 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
29850 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
29860 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
29870 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29880 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
29890 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
298a0 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
298b0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
298c0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
298d0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
298e0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
298f0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
29900 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
29910 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
29920 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
29930 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
29940 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
29950 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
29960 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29970 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29980 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
29990 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
299a0 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
299b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
299c0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
299d0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
299e0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
299f0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
29a00 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
29a10 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
29a20 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
29a30 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
29a40 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
29a50 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
29a60 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
29a70 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
29a80 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
29a90 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
29aa0 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
29ab0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
29ac0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
29ad0 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
29ae0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
29af0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
29b00 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
29b10 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
29b20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
29b30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29b40 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
29b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29b60 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
29b70 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
29b80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
29b90 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
29ba0 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
29bb0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
29bc0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
29bd0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
29be0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
29bf0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
29c00 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
29c10 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
29c20 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
29c30 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
29c40 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
29c50 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
29c60 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
29c70 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
29c80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
29c90 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
29ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
29cb0 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
29cc0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
29cd0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
29ce0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
29cf0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
29d00 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
29d10 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
29d20 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
29d30 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
29d40 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
29d50 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
29d60 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
29d70 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
29d80 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
29d90 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
29da0 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
29db0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
29dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
29de0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
29df0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
29e00 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
29e10 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
29e20 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
29e30 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
29e40 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
29e50 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
29e60 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
29e70 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
29e80 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
29e90 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
29ea0 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
29eb0 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
29ec0 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
29ed0 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
29ee0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
29ef0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
29f00 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
29f10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
29f20 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
29f30 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
29f40 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
29f50 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
29f60 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
29f70 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
29f80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
29f90 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
29fa0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
29fb0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
29fc0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
29fd0 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
29fe0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
29ff0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
2a000 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
2a010 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
2a020 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2a030 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2a040 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2a050 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
2a060 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2a070 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
2a080 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
2a090 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
2a0a0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2a0b0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2a0c0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
2a0d0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
2a0e0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
2a0f0 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
2a100 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2a110 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2a120 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2a130 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a140 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2a150 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2a160 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
2a170 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
2a180 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2a190 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
2a1a0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
2a1b0 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
2a1c0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2a1d0 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
2a1e0 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
2a1f0 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
2a200 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
2a210 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
2a220 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
2a230 20 70 63 20 3c 20 67 65 74 32 62 79 74 65 28 26   pc < get2byte(&
2a240 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
2a250 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
2a260 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2a270 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
2a280 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a290 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2a2a0 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
2a2b0 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
2a2c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2a2d0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2a2e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2a2f0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
2a300 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
2a310 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
2a320 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
2a330 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
2a340 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
2a350 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
2a360 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2a370 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2a380 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2a390 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
2a3a0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
2a3b0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
2a3c0 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
2a3d0 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
2a3e0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
2a3f0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
2a400 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
2a410 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
2a420 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
2a430 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
2a440 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
2a450 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
2a460 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
2a470 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
2a480 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
2a490 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
2a4a0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
2a4b0 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
2a4c0 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
2a4d0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
2a4e0 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
2a4f0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
2a500 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
2a510 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
2a520 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
2a530 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
2a540 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
2a550 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
2a560 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
2a570 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
2a580 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
2a590 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
2a5a0 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
2a5b0 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
2a5c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
2a5d0 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
2a5e0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
2a5f0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
2a600 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
2a610 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
2a620 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2a630 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
2a640 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2a650 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
2a660 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
2a670 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
2a680 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
2a690 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
2a6a0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
2a6b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a6c0 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
2a6d0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2a6e0 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
2a6f0 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
2a700 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
2a710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2a720 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
2a730 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
2a740 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2a750 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
2a760 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2a770 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
2a780 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
2a790 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
2a7a0 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
2a7b0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
2a7c0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
2a7d0 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
2a7e0 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
2a7f0 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
2a800 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
2a810 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
2a820 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
2a830 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
2a840 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
2a850 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
2a860 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
2a870 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
2a880 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
2a890 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
2a8a0 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
2a8b0 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
2a8c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
2a8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a8e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2a8f0 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
2a900 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
2a910 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
2a920 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2a930 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
2a940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2a950 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
2a960 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
2a970 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
2a980 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
2a990 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
2a9a0 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
2a9b0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
2a9c0 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
2a9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a9e0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
2a9f0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
2aa00 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
2aa10 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
2aa20 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2aa30 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
2aa40 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70   */..  int nSkip
2aa50 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a   = (iChild ? 4 :
2aa60 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43   0);..  if( *pRC
2aa70 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
2aa80 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
2aa90 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
2aaa0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
2aab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2aac0 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
2aad0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
2aae0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
2aaf0 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
2ab00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2ab10 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2ab20 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
2ab30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ab40 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2ab50 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
2ab60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ab70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2ab80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2ab90 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
2aba0 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
2abb0 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
2abc0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
2abd0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2abe0 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
2abf0 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2ac00 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
2ac10 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
2ac20 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2ac30 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2ac40 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
2ac50 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
2ac60 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
2ac70 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
2ac80 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
2ac90 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
2aca0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
2acb0 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
2acc0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
2acd0 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
2ace0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
2acf0 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  dx = (u16)i;.  }
2ad00 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
2ad10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ad20 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2ad30 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2ad40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ad50 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
2ad60 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2ad70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2ad80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ad90 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2ada0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
2adb0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2adc0 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ta;.    cellOffs
2add0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
2ade0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
2adf0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2ae00 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
2ae10 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
2ae20 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72  set + 2*i;.    r
2ae30 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
2ae40 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
2ae50 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
2ae60 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74  { *pRC = rc; ret
2ae70 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68  urn; }.    /* Th
2ae80 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  e allocateSpace(
2ae90 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e  ) routine guaran
2aea0 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tees the followi
2aeb0 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65  ng two propertie
2aec0 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
2aed0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a  eturns success *
2aee0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
2aef0 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20  x >= end+2 );.  
2af00 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a    assert( idx+sz
2af10 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   <= pPage->pBt->
2af20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2af30 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
2af40 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
2af50 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
2af60 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
2af70 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
2af80 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2af90 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66  z-nSkip);.    if
2afa0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2afb0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
2afc0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
2afd0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
2afe0 65 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  end, ptr=&data[j
2aff0 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
2b000 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
2b010 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
2b020 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
2b030 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
2b040 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2b050 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
2b060 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2b070 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2b080 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
2b090 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2b0a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b0b0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2b0c0 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
2b0d0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
2b0e0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
2b0f0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
2b100 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2b110 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
2b120 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2b130 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2b140 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
2b150 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
2b160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
2b170 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2b180 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
2b190 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2b1a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2b1b0 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
2b1c0 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
2b1d0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
2b1e0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
2b1f0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
2b200 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
2b210 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
2b220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b230 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
2b240 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2b250 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
2b260 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
2b270 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
2b280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
2b290 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
2b2a0 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
2b2b0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2b2c0 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
2b2d0 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
2b2e0 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
2b2f0 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
2b300 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
2b310 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2b320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2b330 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
2b340 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
2b350 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2b360 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
2b370 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
2b380 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
2b390 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2b3a0 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
2b3b0 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
2b3c0 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
2b3d0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2b3e0 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
2b3f0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2b400 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
2b410 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
2b420 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2b430 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
2b440 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2b450 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
2b460 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2b470 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
2b480 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
2b490 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2b4a0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2b4b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b4c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2b4d0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2b4e0 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
2b4f0 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58  >=0 && nCell<=MX
2b500 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2b510 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
2b520 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29  ge->pBt)<=5460 )
2b530 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b540 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b550 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2b560 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
2b570 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2b580 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
2b590 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
2b5a0 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
2b5b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2b5c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2b5d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b5e0 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b  +5])==nUsable );
2b5f0 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26  ..  pCellptr = &
2b600 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2b610 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
2b620 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
2b630 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
2b640 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
2b650 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c 70  i--){.    pCellp
2b660 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
2b670 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b 69  lbody -= aSize[i
2b680 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  ];.    put2byte(
2b690 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
2b6a0 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
2b6b0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
2b6c0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
2b6d0 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75 74  e[i]);.  }.  put
2b6e0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2b6f0 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
2b700 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b710 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
2b720 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
2b730 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
2b740 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
2b750 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
2b760 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
2b770 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2b780 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
2b790 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
2b7a0 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
2b7b0 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
2b7c0 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
2b7d0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
2b7e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2b7f0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
2b800 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
2b810 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
2b820 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
2b830 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
2b840 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
2b850 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
2b860 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
2b870 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
2b880 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
2b890 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
2b8a0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2b8b0 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
2b8c0 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
2b8d0 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
2b8e0 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
2b8f0 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
2b900 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
2b910 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
2b920 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
2b930 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
2b940 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
2b950 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
2b960 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
2b970 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
2b980 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
2b990 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
2b9a0 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
2b9b0 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
2b9c0 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
2b9d0 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
2b9e0 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
2b9f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
2ba00 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2ba10 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
2ba20 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
2ba30 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
2ba40 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
2ba50 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
2ba60 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
2ba70 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2ba80 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
2ba90 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
2baa0 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
2bab0 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
2bac0 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
2bad0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
2bae0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
2baf0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
2bb00 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
2bb10 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
2bb20 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
2bb30 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
2bb40 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
2bb50 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
2bb60 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
2bb70 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
2bb80 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
2bb90 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2bba0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2bbb0 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2bbc0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2bbd0 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2bbe0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2bbf0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2bc00 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2bc10 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2bc20 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2bc30 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2bc40 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2bc50 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2bc60 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2bc70 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2bc80 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2bc90 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2bca0 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2bcb0 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2bcc0 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2bcd0 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2bce0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2bcf0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2bd00 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2bd10 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2bd20 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2bd30 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2bd40 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2bd50 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2bd60 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2bd70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2bd80 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2bd90 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2bda0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2bdb0 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2bdc0 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2bdd0 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2bde0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2bdf0 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2be00 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2be10 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2be20 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2be30 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2be40 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2be50 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2be60 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2be70 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2be80 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2be90 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2bea0 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2beb0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2bec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2bed0 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2bee0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2bef0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2bf00 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2bf10 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2bf20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2bf30 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2bf40 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2bf50 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf70 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2bf80 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2bf90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfb0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2bfc0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2bfd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2bff0 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2c000 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2c010 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c020 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2c030 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2c040 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c050 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2c060 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2c070 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2c080 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2c090 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
2c0a0 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll<=0 ) return S
2c0b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c0c0 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
2c0d0 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
2c0e0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2c0f0 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
2c100 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
2c110 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
2c120 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
2c130 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
2c140 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2c150 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
2c160 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
2c170 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
2c180 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
2c190 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
2c1a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2c1b0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2c1c0 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
2c1d0 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
2c1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
2c1f0 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
2c200 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
2c210 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
2c220 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
2c230 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
2c240 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2c250 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2c260 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
2c270 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c280 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c290 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
2c2a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c2b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
2c2c0 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2c2d0 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2c2e0 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
2c2f0 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
2c300 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2c310 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
2c320 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
2c330 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
2c340 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
2c350 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2c360 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2c370 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2c380 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
2c390 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
2c3a0 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
2c3b0 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
2c3c0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
2c3d0 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
2c3e0 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
2c3f0 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
2c400 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
2c410 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
2c420 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
2c430 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
2c440 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
2c450 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
2c460 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
2c470 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
2c480 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
2c490 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
2c4a0 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
2c4b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c4c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2c4d0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
2c4e0 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
2c4f0 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
2c500 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
2c510 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
2c520 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
2c530 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
2c540 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2c550 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2c560 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2c570 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2c580 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
2c590 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
2c5a0 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
2c5b0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2c5c0 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
2c5d0 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
2c5e0 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
2c5f0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , pCell, &rc);. 
2c600 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2c610 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2c620 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
2c630 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
2c640 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
2c650 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
2c660 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
2c670 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
2c680 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2c690 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
2c6a0 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
2c6b0 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
2c6c0 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
2c6d0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
2c6e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
2c6f0 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
2c700 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2c710 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
2c720 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
2c730 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
2c740 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
2c750 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
2c760 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
2c770 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
2c780 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
2c790 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
2c7a0 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
2c7b0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2c7c0 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
2c7d0 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
2c7e0 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
2c7f0 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
2c800 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2c810 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
2c820 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
2c830 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
2c840 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
2c850 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
2c860 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
2c870 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
2c880 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
2c890 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
2c8a0 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
2c8b0 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
2c8c0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
2c8d0 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
2c8e0 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
2c8f0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c900 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
2c910 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
2c920 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2c930 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
2c940 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
2c950 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2c960 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2c970 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2c980 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
2c990 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
2c9a0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2c9b0 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
2c9c0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
2c9d0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
2c9e0 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
2c9f0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2ca00 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  t, pParent->nCel
2ca10 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29  l, pSpace, (int)
2ca20 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20  (pOut-pSpace),. 
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
2ca40 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72   pPage->pgno, &r
2ca50 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  c);..    /* Set 
2ca60 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2ca70 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
2ca80 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
2ca90 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
2caa0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2cab0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
2cac0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
2cad0 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
2cae0 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
2caf0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2cb00 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
2cb10 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
2cb20 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
2cb30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2cb40 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2cb50 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
2cb60 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
2cb70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
2cb80 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2cb90 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
2cba0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
2cbb0 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
2cbc0 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
2cbd0 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
2cbe0 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
2cbf0 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
2cc00 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
2cc10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2cc20 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
2cc30 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
2cc40 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
2cc50 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
2cc60 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
2cc70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
2cc80 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
2cc90 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
2cca0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
2ccb0 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
2ccc0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
2ccd0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2cce0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ccf0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
2cd00 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
2cd10 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
2cd20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
2cd30 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
2cd40 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
2cd50 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2cd60 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , j);.      btre
2cd70 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2cd80 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
2cd90 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
2cda0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2cdb0 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
2cdc0 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
2cdd0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2cde0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2cdf0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
2ce00 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2ce10 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2ce20 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2ce30 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
2ce40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2ce50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ce60 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
2ce70 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
2ce80 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
2ce90 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
2cea0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
2ceb0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2cec0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2ced0 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2cee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2cef0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2cf00 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
2cf10 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
2cf20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2cf30 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2cf40 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
2cf50 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
2cf60 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
2cf70 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2cf80 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2cf90 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
2cfa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2cfb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2cfc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2cfd0 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
2cfe0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cff0 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
2d000 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
2d010 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2d020 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
2d030 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
2d040 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
2d050 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2d060 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
2d070 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
2d080 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2d090 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
2d0a0 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
2d0b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
2d0c0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
2d0d0 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
2d0e0 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
2d0f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2d100 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
2d110 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
2d120 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
2d130 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
2d140 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2d150 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2d160 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
2d170 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
2d180 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
2d190 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
2d1a0 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
2d1b0 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f  he.** MemPage.aO
2d1c0 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
2d1d0 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
2d1e0 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
2d1f0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
2d200 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
2d210 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
2d220 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ng btreeInitPage
2d230 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
2d240 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
2d250 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
2d260 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
2d270 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
2d280 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
2d290 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
2d2a0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
2d2b0 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
2d2c0 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
2d2d0 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
2d2e0 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
2d2f0 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
2d300 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79  static void copy
2d310 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50  NodeContent(MemP
2d320 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50  age *pFrom, MemP
2d330 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70  age *pTo, int *p
2d340 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
2d350 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
2d360 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63      BtShared * c
2d370 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
2d380 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20  ->pBt;.    u8 * 
2d390 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46  const aFrom = pF
2d3a0 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  rom->aData;.    
2d3b0 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
2d3c0 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20   pTo->aData;.   
2d3d0 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
2d3e0 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
2d3f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  Offset;.    int 
2d400 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
2d410 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
2d420 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 54   100 : 0);.    T
2d430 45 53 54 4f 4e 4c 59 28 69 6e 74 20 72 63 3b 29  ESTONLY(int rc;)
2d440 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a  .    int iData;.
2d450 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74    .  .    assert
2d460 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
2d470 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2d480 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f  From->nFree>=iTo
2d490 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Hdr );.    asser
2d4a0 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46 72  t( get2byte(&aFr
2d4b0 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c  om[iFromHdr+5])<
2d4c0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
2d4d0 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f   );.  .    /* Co
2d4e0 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  py the b-tree no
2d4f0 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  de content from 
2d500 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
2d510 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69  ge pTo. */.    i
2d520 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28  Data = get2byte(
2d530 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
2d540 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  5]);.    memcpy(
2d550 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46  &aTo[iData], &aF
2d560 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d  rom[iData], pBt-
2d570 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74  >usableSize-iDat
2d580 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  a);.    memcpy(&
2d590 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
2d5a0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
2d5b0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
2d5c0 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
2d5d0 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  l);.  .    /* Re
2d5e0 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20  initialize page 
2d5f0 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  pTo so that the 
2d600 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2d610 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
2d620 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74  e.    ** match t
2d630 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65  he new data. The
2d640 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2d650 6f 66 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22 20  of pTo "cannot" 
2d660 66 61 69 6c 2c 20 61 73 20 74 68 65 0a 20 20 20  fail, as the.   
2d670 20 2a 2a 20 64 61 74 61 20 63 6f 70 69 65 64 20   ** data copied 
2d680 66 72 6f 6d 20 70 46 72 6f 6d 20 69 73 20 6b 6e  from pFrom is kn
2d690 6f 77 6e 20 74 6f 20 62 65 20 76 61 6c 69 64 2e  own to be valid.
2d6a0 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73    */.    pTo->is
2d6b0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 54 45  Init = 0;.    TE
2d6c0 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20 62 74  STONLY(rc = ) bt
2d6d0 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29  reeInitPage(pTo)
2d6e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
2d6f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2d700 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2d710 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
2d720 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
2d730 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
2d740 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
2d750 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
2d760 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
2d770 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
2d780 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
2d790 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
2d7a0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2d7b0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2d7c0 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
2d7d0 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
2d7e0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2d7f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2d800 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2d810 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2d820 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2d830 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2d840 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2d850 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2d860 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2d870 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2d880 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2d890 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2d8a0 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2d8b0 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2d8c0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2d8d0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2d8e0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2d8f0 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2d900 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2d910 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2d920 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2d930 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2d940 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2d950 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2d960 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2d970 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2d980 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2d990 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2d9a0 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2d9b0 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2d9c0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2d9d0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2d9e0 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2d9f0 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2da00 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2da10 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2da20 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2da30 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2da40 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2da50 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2da60 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2da70 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2da80 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2da90 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2daa0 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2dab0 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2dac0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2dad0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2dae0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2daf0 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2db00 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2db10 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2db20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2db30 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2db40 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2db50 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2db60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2db70 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2db80 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2db90 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2dba0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2dbb0 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2dbc0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2dbd0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2dbe0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2dbf0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2dc00 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2dc10 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2dc20 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2dc30 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2dc40 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2dc50 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2dc60 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2dc70 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2dc80 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2dc90 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2dca0 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2dcb0 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2dcc0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2dcd0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2dce0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2dcf0 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2dd00 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2dd10 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2dd20 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2dd30 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2dd40 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2dd50 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2dd60 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2dd70 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2dd80 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2dd90 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2dda0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2ddb0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2ddc0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2ddd0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2dde0 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2ddf0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2de00 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2de10 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2de20 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2de30 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
2de40 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
2de50 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
2de60 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
2de70 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
2de80 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
2de90 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
2dea0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
2deb0 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
2dec0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
2ded0 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
2dee0 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
2def0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2df00 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
2df10 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
2df20 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
2df30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
2df40 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
2df50 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
2df60 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
2df70 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
2df80 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
2df90 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
2dfa0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
2dfb0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
2dfc0 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
2dfd0 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
2dfe0 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
2dff0 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
2e000 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
2e010 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
2e020 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
2e030 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2e040 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
2e050 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
2e060 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f  c int balance_no
2e070 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65  nroot(.  MemPage
2e080 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20   *pParent,      
2e090 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65           /* Pare
2e0a0 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69  nt page of sibli
2e0b0 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ngs being balanc
2e0c0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ed */.  int iPar
2e0d0 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20  entIdx,         
2e0e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2e0f0 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69   of "the page" i
2e100 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75  n pParent */.  u
2e110 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20  8 *aOvflSpace,  
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e130 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  * page-size byte
2e140 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70  s of space for p
2e150 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20  arent ovfl */.  
2e160 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20  int isRoot      
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e180 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65  /* True if pPare
2e190 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67  nt is a root-pag
2e1a0 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  e */.){.  BtShar
2e1b0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
2e1c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
2e1d0 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
2e1e0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e200 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
2e210 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
2e220 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
2e230 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e240 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
2e250 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
2e260 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
2e270 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e290 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2e2a0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
2e2b0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e2d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2e2e0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
2e2f0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e310 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2e320 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
2e330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e340 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
2e350 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
2e360 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
2e370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e380 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  K;          /* T
2e390 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2e3a0 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72  /.  u16 leafCorr
2e3b0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
2e3c0 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
2e3d0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2e3e0 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
2e3f0 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
2e400 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e410 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2e420 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
2e430 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2e440 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
2e450 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
2e460 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
2e470 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
2e480 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
2e490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2e4a0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
2e4b0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
2e4c0 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
2e4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2e4e0 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
2e4f0 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
2e500 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
2e510 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
2e520 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2e530 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
2e540 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
2e550 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b   iOvflSpace = 0;
2e560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2e570 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2e580 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a  f aOvflSpace[] *
2e590 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
2e5a0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2e5b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
2e5c0 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
2e5d0 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
2e5e0 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
2e5f0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2e600 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
2e610 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50  blings */.  MemP
2e620 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
2e630 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
2e640 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
2e650 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
2e660 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
2e670 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
2e680 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2e690 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
2e6a0 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
2e6b0 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20    u8 *pRight;   
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6d0 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61  * Location in pa
2e6e0 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69  rent of right-si
2e6f0 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f  bling pointer */
2e700 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d  .  u8 *apDiv[NB-
2e710 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
2e720 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
2e730 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
2e740 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
2e750 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
2e760 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
2e770 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
2e780 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
2e790 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2e7b0 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
2e7c0 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
2e7d0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
2e7e0 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
2e7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
2e800 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
2e810 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
2e820 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
2e830 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2e840 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
2e850 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2e860 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
2e870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e880 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
2e890 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
2e8a0 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
2e8b0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
2e8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
2e8d0 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
2e8e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e8f0 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72  */..  pBt = pPar
2e900 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
2e910 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e920 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2e930 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2e940 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e950 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2e960 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
2e970 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
2e980 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
2e990 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
2e9a0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2e9b0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
2e9c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2e9d0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
2e9e0 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
2e9f0 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
2ea00 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
2ea10 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
2ea20 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
2ea30 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
2ea40 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
2ea50 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
2ea60 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
2ea70 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
2ea80 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2ea90 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
2eaa0 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
2eab0 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
2eac0 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
2ead0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2eae0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
2eaf0 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
2eb00 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
2eb10 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
2eb20 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
2eb30 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  arent->aOvfl[0].
2eb40 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20  idx==iParentIdx 
2eb50 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c  );..  if( !aOvfl
2eb60 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74  Space ){.    ret
2eb70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2eb80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
2eb90 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
2eba0 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41  es to balance. A
2ebb0 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63  lso locate the c
2ebc0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
2ebd0 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64  .  ** that divid
2ebe0 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  e the siblings. 
2ebf0 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
2ec00 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69  de to find NN si
2ec10 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20  blings on .  ** 
2ec20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2ec30 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69  Page. More sibli
2ec40 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
2ec50 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77  om one side, how
2ec60 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74  ever, .  ** if t
2ec70 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
2ec80 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
2ec90 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
2eca0 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  e. If pParent.  
2ecb0 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
2ecc0 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
2ecd0 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
2ece0 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
2ecf0 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  en.  .  **.  ** 
2ed00 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64  This loop also d
2ed10 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72  rops the divider
2ed20 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20   cells from the 
2ed30 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69  parent page. Thi
2ed40 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20  s.  ** way, the 
2ed50 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
2ed60 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2ed70 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20  ot have to deal 
2ed80 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76  with any.  ** ov
2ed90 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20  erflow cells in 
2eda0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
2edb0 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78   since if any ex
2edc0 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a  isted they will.
2edd0 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64    ** have alread
2ede0 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a  y been removed..
2edf0 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65    */.  i = pPare
2ee00 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20  nt->nOverflow + 
2ee10 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a  pParent->nCell;.
2ee20 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20    if( i<2 ){.   
2ee30 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
2ee40 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65  nOld = i+1;.  }e
2ee50 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  lse{.    nOld = 
2ee60 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65  3;.    if( iPare
2ee70 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20  ntIdx==0 ){     
2ee80 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
2ee90 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
2eea0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72    }else if( iPar
2eeb0 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20  entIdx==i ){.   
2eec0 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a     nxDiv = i-2;.
2eed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eee0 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74   nxDiv = iParent
2eef0 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  Idx-1;.    }.   
2ef00 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66   i = 2;.  }.  if
2ef10 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
2ef20 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
2ef30 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2ef40 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
2ef50 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2ef60 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2ef70 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
2ef80 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
2ef90 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
2efa0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2efb0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
2efc0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2efd0 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
2efe0 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
2eff0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2f000 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
2f010 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
2f020 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  c ){.      memse
2f030 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
2f040 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
2f050 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  *));.      goto 
2f060 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2f070 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43  .    }.    nMaxC
2f080 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b  ells += 1+apOld[
2f090 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b  i]->nCell+apOld[
2f0a0 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  i]->nOverflow;. 
2f0b0 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20     if( (i--)==0 
2f0c0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66  ) break;..    if
2f0d0 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  ( i+nxDiv==pPare
2f0e0 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
2f0f0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
2f100 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
2f110 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
2f120 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  nt->aOvfl[0].pCe
2f130 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  ll;.      pgno =
2f140 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2f150 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2f160 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2f170 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2f180 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72  [i]);.      pPar
2f190 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ent->nOverflow =
2f1a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2f1b0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2f1c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
2f1d0 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
2f1e0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
2f1f0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
2f200 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
2f210 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
2f220 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2f230 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
2f240 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20  ..      /* Drop 
2f250 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  the cell from th
2f260 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61  e parent page. a
2f270 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f  pDiv[i] still po
2f280 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ints to.      **
2f290 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2f2a0 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65   the parent, eve
2f2b0 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20  n though it has 
2f2c0 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20  been dropped..  
2f2d0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73      ** This is s
2f2e0 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70  afe because drop
2f2f0 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79  ping a cell only
2f300 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
2f310 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
2f320 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c  our bytes of it,
2f330 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
2f340 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
2f350 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2f360 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2f370 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
2f380 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74  ll. So the point
2f390 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  er is safe to us
2f3a0 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72  e.      ** later
2f3b0 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a   on.  .      **.
2f3c0 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
2f3d0 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
2f3e0 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c  ed in secure-del
2f3f0 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ete mode. In thi
2f400 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a  s case,.      **
2f410 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20   the dropCell() 
2f420 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65  routine will ove
2f430 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72  rwrite the entir
2f440 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f  e cell with zero
2f450 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  es..      ** In 
2f460 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f  this case, tempo
2f470 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20  rarily copy the 
2f480 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f  cell into the aO
2f490 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20  vflSpace[].     
2f4a0 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77   ** buffer. It w
2f4b0 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75  ill be copied ou
2f4c0 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20  t again as soon 
2f4d0 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20  as the aSpace[] 
2f4e0 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20  buffer.      ** 
2f4f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a  is allocated.  *
2f500 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2f510 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
2f520 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66      memcpy(&aOvf
2f530 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
2f540 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 2c  pParent->aData],
2f550 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
2f560 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 70 44 69  [i]);.      apDi
2f570 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61  v[i] = &aOvflSpa
2f580 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
2f590 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 23 65 6e  ent->aData];.#en
2f5a0 64 69 66 0a 20 20 20 20 20 20 64 72 6f 70 43 65  dif.      dropCe
2f5b0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2f5c0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2f5d0 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d  erflow, szNew[i]
2f5e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
2f5f0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2f600 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2f610 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2f620 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2f630 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2f640 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2f650 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2f660 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2f670 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2f680 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2f690 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
2f6a0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
2f6b0 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
2f6c0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
2f6d0 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
2f6e0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2f6f0 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
2f700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2f710 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
2f720 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2f730 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
2f740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2f750 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
2f760 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2f790 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2f7a0 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
2f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f7d0 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
2f7e0 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
2f7f0 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
2f800 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
2f810 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
2f820 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
2f830 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2f840 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2f850 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2f860 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2f870 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
2f880 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
2f890 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
2f8a0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
2f8b0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2f8c0 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
2f8d0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
2f8e0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
2f8f0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
2f900 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
2f910 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2f920 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
2f930 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
2f940 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
2f950 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2f960 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
2f970 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
2f980 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
2f990 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
2f9a0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
2f9b0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
2f9c0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
2f9d0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2f9e0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
2f9f0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
2fa00 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
2fa10 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
2fa20 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
2fa30 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
2fa40 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
2fa50 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
2fa60 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
2fa70 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
2fa80 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
2fa90 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
2faa0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2fab0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
2fac0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2fad0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
2fae0 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
2faf0 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
2fb00 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
2fb10 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2fb20 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
2fb30 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
2fb40 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
2fb50 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
2fb60 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
2fb70 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
2fb80 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
2fb90 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
2fba0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
2fbb0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
2fbc0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
2fbd0 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
2fbe0 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
2fbf0 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
2fc00 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
2fc10 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
2fc20 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2fc30 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
2fc40 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
2fc50 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
2fc60 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
2fc70 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
2fc80 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
2fc90 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
2fca0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
2fcb0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
2fcc0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
2fcd0 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
2fce0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
2fcf0 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
2fd00 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2fd10 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
2fd20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
2fd30 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2fd40 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
2fd50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2fd60 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2fd70 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
2fd80 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
2fd90 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2fda0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2fdb0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2fdc0 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
2fdd0 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
2fde0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2fdf0 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2fe00 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2fe10 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
2fe20 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2fe30 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2fe40 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2fe50 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2fe60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2fe70 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2fe80 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2fe90 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2fea0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2feb0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2fec0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2fed0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2fee0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2fef0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2ff00 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
2ff10 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
2ff20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
2ff30 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
2ff40 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2ff50 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2ff60 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
2ff70 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2ff80 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
2ff90 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
2ffa0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
2ffb0 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2ffc0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2ffd0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2ffe0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2fff0 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
30000 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
30010 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
30020 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
30030 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
30040 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
30050 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
30060 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
30070 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
30080 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
30090 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
300a0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
300b0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
300c0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
300d0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
300e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
300f0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
30100 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
30110 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
30120 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
30130 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
30140 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
30150 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
30160 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
30170 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
30180 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
30190 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
301a0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
301b0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
301c0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
301d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
301e0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
301f0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
30200 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
30210 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
30220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
30230 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
30240 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
30250 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
30260 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
30270 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
30280 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30290 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
302a0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
302b0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
302c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
302d0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
302e0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
302f0 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
30300 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
30310 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
30320 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
30330 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
30340 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
30350 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
30360 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
30370 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
30380 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
30390 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
303a0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
303b0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
303c0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
303d0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
303e0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
303f0 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
30400 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
30410 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
30420 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
30430 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
30440 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
30450 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
30460 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
30470 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
30480 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
30490 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
304a0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
304b0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
304c0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
304d0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
304e0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
304f0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
30500 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
30510 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
30520 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
30530 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
30540 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
30550 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
30560 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
30570 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
30580 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
30590 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
305a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
305b0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
305c0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
305d0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
305e0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
305f0 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
30600 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
30610 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
30620 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
30630 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
30640 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
30650 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
30660 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
30670 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
30680 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
30690 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
306a0 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63  UPT; goto balanc
306b0 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20  e_cleanup; }.   
306c0 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
306d0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
306e0 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
306f0 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
30700 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
30710 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
30720 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
30730 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
30740 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
30750 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
30760 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
30770 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
30780 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
30790 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
307a0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
307b0 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
307c0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
307d0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
307e0 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
307f0 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
30800 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
30810 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
30820 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
30830 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
30840 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
30850 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
30860 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
30870 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
30880 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
30890 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
308a0 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
308b0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
308c0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
308d0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
308e0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
308f0 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
30900 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
30910 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
30920 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
30930 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
30940 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
30950 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
30960 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
30970 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
30980 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
30990 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
309a0 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
309c0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
309d0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
309e0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
309f0 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
30a00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
30a10 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
30a20 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
30a30 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
30a40 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
30a50 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
30a60 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
30a70 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
30a80 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
30a90 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
30aa0 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
30ab0 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
30ac0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
30ad0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
30ae0 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
30af0 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
30b00 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
30b10 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
30b20 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
30b30 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
30b40 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
30b50 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
30b60 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
30b70 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
30b80 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
30b90 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
30ba0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
30bb0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
30bc0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
30bd0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
30be0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
30bf0 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
30c00 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
30c10 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
30c20 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
30c30 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
30c40 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
30c50 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
30c60 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
30c70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
30c80 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
30c90 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
30ca0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
30cb0 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
30cc0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
30cd0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
30ce0 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30    ",.    apOld[0
30cf0 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f  ]->pgno, .    nO
30d00 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d  ld>=2 ? apOld[1]
30d10 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20  ->pgno : 0,.    
30d20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b  nOld>=3 ? apOld[
30d30 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29  2]->pgno : 0.  )
30d40 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
30d50 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
30d60 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
30d70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
30d80 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
30d90 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d  apOld[0]->pgno<=
30da0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
30db0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
30dc0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
30dd0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
30de0 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
30df0 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
30e00 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
30e10 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
30e20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
30e30 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
30e40 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
30e50 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
30e60 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
30e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30e80 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
30e90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30ea0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
30eb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
30ec0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
30ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30ee0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
30ef0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
30f00 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
30f10 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70   &pNew, &pgno, p
30f20 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  gno, 0);.      i
30f30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
30f40 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
30f50 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
30f60 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
30f70 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  +;..      /* Set
30f80 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30f90 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
30fa0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
30fb0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53   */.      if( IS
30fc0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
30fd0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
30fe0 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  pBt, pNew->pgno,
30ff0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
31000 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
31010 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
31020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31030 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31040 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
31050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31060 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
31070 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
31080 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
31090 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
310a0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
310b0 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
310c0 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70  .    freePage(ap
310d0 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  Old[i], &rc);.  
310e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
310f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
31100 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
31110 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
31120 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
31130 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
31140 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
31150 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
31160 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
31170 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
31180 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
31190 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
311a0 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
311b0 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
311c0 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
311d0 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
311e0 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
311f0 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
31200 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
31210 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
31220 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
31230 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
31240 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
31250 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
31260 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
31270 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
31280 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
31290 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
312a0 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
312b0 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
312c0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
312d0 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
312e0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
312f0 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
31300 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
31310 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
31320 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
31330 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
31340 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
31350 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
31360 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
31370 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
31380 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  V = apNew[i]->pg
31390 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  no;.    int minI
313a0 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
313b0 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
313c0 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b        if( apNew[
313d0 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e  j]->pgno<(unsign
313e0 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
313f0 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
31400 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65       minV = apNe
31410 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[j]->pgno;.    
31420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
31430 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
31440 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
31450 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
31460 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e    t = apNew[i]->
31470 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d  pgno;.      pT =
31480 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
31490 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
314a0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
314b0 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
314c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
314d0 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
314e0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
314f0 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
31500 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
31510 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
31520 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
31530 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
31540 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
31550 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
31560 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
31570 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
31580 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
31590 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
315a0 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
315b0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
315c0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
315d0 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
315e0 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
315f0 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
31600 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
31610 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
31620 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
31630 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
31640 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
31650 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
31660 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
31670 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
31680 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
31690 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
316a0 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
316b0 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
316c0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
316d0 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
316e0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
316f0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
31700 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
31710 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
31720 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
31730 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
31740 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
31750 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
31760 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
31770 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
31780 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
31790 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
317a0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
317b0 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
317c0 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
317d0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
317e0 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
317f0 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
31800 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
31810 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
31820 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
31830 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
31840 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
31850 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
31860 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
31870 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
31880 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
31890 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
318a0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
318b0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
318c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
318d0 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
318e0 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
318f0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
31900 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
31910 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
31920 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
31930 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
31940 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
31950 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
31960 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
31970 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
31980 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
31990 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
319a0 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
319b0 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
319c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
319d0 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
319e0 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
319f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
31a00 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
31a10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31a20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
31a30 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
31a40 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
31a50 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
31a60 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
31a70 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
31a80 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
31a90 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
31aa0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
31ab0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
31ac0 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
31ad0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
31ae0 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
31af0 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
31b00 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
31b10 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
31b20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31b30 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
31b40 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
31b50 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
31b60 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
31b70 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
31b80 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
31b90 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
31ba0 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
31bb0 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
31bc0 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
31bd0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
31be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31bf0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
31c00 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
31c10 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
31c20 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
31c30 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
31c40 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
31c50 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
31c60 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
31c70 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
31c80 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
31c90 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
31ca0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
31cb0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
31cc0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
31cd0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
31ce0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
31cf0 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
31d00 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
31d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
31d20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
31d30 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
31d40 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
31d50 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
31d60 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
31d70 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
31d80 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
31d90 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31da0 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
31db0 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
31dc0 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
31dd0 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
31de0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
31df0 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
31e00 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
31e10 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
31e20 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
31e30 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
31e40 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
31e50 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
31e60 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
31e70 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
31e80 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
31e90 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
31ea0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
31eb0 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
31ec0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
31ed0 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
31ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31ef0 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
31f00 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
31f10 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
31f20 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
31f30 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70   assert( iOvflSp
31f40 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
31f50 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
31f60 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
31f70 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
31f80 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
31f90 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
31fa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31fb0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
31fc0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
31fd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31fe0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31ff0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
32000 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
32010 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
32020 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
32030 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
32040 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
32050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
32060 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
32070 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
32080 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
32090 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
320a0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
320b0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
320c0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
320d0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
320e0 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
320f0 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
32100 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
32110 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
32120 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
32130 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
32140 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
32150 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
32160 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
32170 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
32180 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
32190 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
321a0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
321b0 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
321c0 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
321d0 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
321e0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
321f0 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
32200 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
32210 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
32220 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
32230 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
32240 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
32250 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
32260 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
32270 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
32280 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
32290 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
322a0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
322b0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
322c0 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
322d0 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
322e0 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
322f0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32300 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
32310 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
32320 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
32330 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
32340 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
32350 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
32360 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
32370 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
32380 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
32390 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
323a0 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
323b0 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
323c0 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
323d0 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
323e0 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
323f0 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
32400 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
32410 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
32420 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
32430 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
32440 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
32450 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
32460 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
32470 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
32480 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
32490 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
324a0 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
324b0 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
324c0 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
324d0 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
324e0 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
324f0 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
32500 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
32510 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
32520 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
32530 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
32540 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
32550 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
32560 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
32570 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
32580 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
32590 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
325a0 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
325b0 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
325c0 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
325d0 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
325e0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
325f0 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
32600 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
32610 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
32620 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
32630 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
32640 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
32650 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
32660 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
32670 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
32680 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32690 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
326a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
326b0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
326c0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
326d0 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
326e0 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
326f0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
32700 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
32710 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
32720 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
32730 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
32740 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
32750 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
32760 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
32770 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
32780 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
32790 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
327a0 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
327b0 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
327c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
327d0 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
327e0 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
327f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
32800 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
32810 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
32820 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
32830 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
32840 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
32850 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
32860 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
32870 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
32880 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
32890 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
328a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
328b0 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
328c0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
328d0 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
328e0 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
328f0 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
32900 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
32910 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
32920 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
32930 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
32940 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
32950 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
32960 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
32970 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
32980 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
32990 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
329a0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
329b0 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
329c0 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
329d0 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
329e0 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
329f0 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
32a00 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
32a10 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
32a20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
32a30 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
32a40 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
32a50 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
32a60 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
32a70 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
32a80 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
32a90 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
32aa0 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
32ab0 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
32ac0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
32ad0 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
32ae0 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
32af0 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
32b00 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
32b10 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
32b20 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
32b30 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
32b40 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
32b50 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
32b60 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
32b70 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
32b80 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
32b90 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
32ba0 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
32bb0 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
32bc0 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
32bd0 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
32be0 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
32bf0 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
32c00 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
32c10 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
32c20 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
32c30 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
32c40 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
32c50 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
32c60 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
32c70 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
32c80 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
32c90 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
32ca0 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
32cb0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
32cc0 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
32cd0 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ow ? pOld->aOvfl
32ce0 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20  [0].idx : -1);. 
32cf0 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20     j = 0;       
32d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d10 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
32d20 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70   'old' sibling p
32d30 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30  age */.    k = 0
32d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32d60 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73   Current 'new' s
32d70 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
32d80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
32d90 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
32da0 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d   int isDivider =
32db0 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
32dc0 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a   i==iNextOld ){.
32dd0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
32de0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
32df0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
32e00 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
32e10 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20  l on old.       
32e20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
32e30 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   j. If the sibli
32e40 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
32e50 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
32e60 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
32e70 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
32e80 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72   i was a divider
32e90 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20   cell. */.      
32ea0 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b    pOld = apCopy[
32eb0 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e  ++j];.        iN
32ec0 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65  extOld = i + !le
32ed0 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e  afData + pOld->n
32ee0 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76  Cell + pOld->nOv
32ef0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
32f00 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
32f10 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
32f20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
32f30 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
32f40 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
32f50 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  w = i + !leafDat
32f60 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  a + pOld->aOvfl[
32f70 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  0].idx;.        
32f80 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
32f90 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
32fa0 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
32fb0 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
32fc0 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
32fd0 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
32fe0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
32ff0 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30  || pOld->aOvfl[0
33000 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
33010 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[1].idx-1);.  
33020 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
33030 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<3 || pOld->
33040 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[1].idx==pO
33050 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78  ld->aOvfl[2].idx
33060 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  -1);.      if( i
33070 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ==iOverflow ){. 
33080 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
33090 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
330a0 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e  ( (--nOverflow)>
330b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
330c0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
330d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
330e0 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e       if( i==cntN
330f0 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20  ew[k] ){.       
33100 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
33110 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
33120 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
33130 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65   last cell on ne
33140 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  w.        ** sib
33150 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20  ling page k. If 
33160 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
33170 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
33180 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
33190 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
331a0 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61  then cell i is a
331b0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20   divider cell.  
331c0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
331d0 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20  = apNew[++k];.  
331e0 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44        if( !leafD
331f0 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ata ) continue;.
33200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
33210 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
33220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
33230 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
33240 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
33250 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
33260 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
33270 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
33280 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
33290 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
332a0 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
332b0 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
332c0 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
332d0 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
332e0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
332f0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
33300 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
33310 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
33320 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
33330 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
33340 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
33350 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
33360 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
33370 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
33380 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
33390 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
333a0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
333b0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
333c0 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
333d0 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
333e0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  REE, pNew->pgno,
333f0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
33400 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
33410 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
33420 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
33430 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
33440 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
33450 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  [i], &rc);.     
33460 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33470 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61   }..    if( !lea
33480 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
33490 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
334a0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
334b0 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65      u32 key = ge
334c0 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d  t4byte(&apNew[i]
334d0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
334e0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
334f0 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f  Bt, key, PTRMAP_
33500 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
33510 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
33520 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20     }.    }..#if 
33530 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72  0.    /* The ptr
33540 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20  mapCheckPages() 
33550 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28  contains assert(
33560 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
33570 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20  t verify that.  
33580 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72    ** all pointer
33590 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73   map pages are s
335a0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68  et correctly. Th
335b0 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68  is is helpful wh
335c0 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75  ile .    ** debu
335d0 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75  gging. This is u
335e0 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20  sually disabled 
335f0 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70  because a corrup
33600 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20  t database may. 
33610 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61     ** cause an a
33620 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
33630 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20  t to fail.  */. 
33640 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
33650 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29  ges(apNew, nNew)
33660 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  ;.    ptrmapChec
33670 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c  kPages(&pParent,
33680 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   1);.#endif.  }.
33690 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
336a0 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
336b0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
336c0 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25   finished: old=%
336d0 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
336e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
336f0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
33700 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  l));..  /*.  ** 
33710 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
33720 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
33730 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
33740 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
33750 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
33760 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
33770 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
33780 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
33790 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
337a0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
337b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
337c0 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20  pNew[i]);.  }.. 
337d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
337e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
337f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
33800 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
33810 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
33820 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
33830 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
33840 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
33850 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
33860 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
33870 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
33880 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
33890 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
338a0 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
338b0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
338c0 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
338d0 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
338e0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
338f0 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
33900 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61  ten to make it a
33910 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
33920 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  h the right-chil
33930 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f  d .** pointer po
33940 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
33950 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  w page..**.** Be
33960 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
33970 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
33980 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
33990 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a  nding to pages .
339a0 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
339b0 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63  child-page now c
339c0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
339d0 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e   to are updated.
339e0 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f   The.** entry co
339f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
33a00 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
33a10 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ld pointer of th
33a20 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
33a30 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a  s also updated..
33a40 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
33a50 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73  ful, *ppChild is
33a60 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
33a70 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
33a80 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67  he child .** pag
33a90 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
33aa0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
33ab0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
33ac0 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64  ller is required
33ad0 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  .** to call rele
33ae0 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70  asePage() on *pp
33af0 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e  Child exactly on
33b00 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ce. If an error 
33b10 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
33b20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
33b30 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c  rned and *ppChil
33b40 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
33b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
33b60 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
33b70 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50  age *pRoot, MemP
33b80 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a  age **ppChild){.
33b90 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bb0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
33bc0 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
33bd0 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
33be0 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20   *pChild = 0;   
33bf0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
33c00 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
33c10 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
33c20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20   pgnoChild = 0; 
33c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
33c40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
33c50 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
33c60 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
33c70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b  Bt = pRoot->pBt;
33c80 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
33c90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
33ca0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Root->nOverflow>
33cb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
33cc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33cd0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33ce0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f  ..  /* Make pRoo
33cf0 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  t, the root page
33d00 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20   of the b-tree, 
33d10 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61  writable. Alloca
33d20 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70  te a new .  ** p
33d30 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
33d40 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67  come the new rig
33d50 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ht-child of pPag
33d60 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  e. Copy the cont
33d70 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
33d80 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20   node stored on 
33d90 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e  pRoot into the n
33da0 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ew child page.. 
33db0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
33dc0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
33dd0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
33de0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33df0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  K ){.    rc = al
33e00 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
33e10 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
33e20 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
33e30 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e  no,0);.    copyN
33e40 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74  odeContent(pRoot
33e50 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a  , pChild, &rc);.
33e60 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
33e70 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
33e80 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
33e90 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
33ea0 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
33eb0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
33ec0 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
33ed0 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b     *ppChild = 0;
33ee0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
33ef0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65  (pChild);.    re
33f00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
33f10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
33f20 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33f30 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
33f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
33f50 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33f60 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
33f70 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
33f80 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
33f90 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b  =pRoot->nCell );
33fa0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
33fb0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
33fc0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52  d into %d\n", pR
33fd0 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  oot->pgno, pChil
33fe0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a  d->pgno));..  /*
33ff0 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c   Copy the overfl
34000 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52  ow cells from pR
34010 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f  oot to pChild */
34020 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64  .  memcpy(pChild
34030 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
34040 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f  aOvfl, pRoot->nO
34050 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
34060 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Root->aOvfl[0]))
34070 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
34080 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e  rflow = pRoot->n
34090 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20  Overflow;..  /* 
340a0 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  Zero the content
340b0 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e  s of pRoot. Then
340c0 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20   install pChild 
340d0 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  as the right-chi
340e0 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67  ld. */.  zeroPag
340f0 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d  e(pRoot, pChild-
34100 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
34110 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
34120 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
34130 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
34140 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
34150 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  ;..  *ppChild = 
34160 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e  pChild;.  return
34170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
34180 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
34190 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
341a0 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
341b0 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
341c0 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
341d0 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
341e0 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
341f0 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
34200 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
34210 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
34220 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
34230 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
34240 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
34250 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
34260 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   Balancing routi
34270 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  nes are:.**.**  
34280 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
34290 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65  .**   balance_de
342a0 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61  eper().**   bala
342b0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f  nce_nonroot().*/
342c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
342d0 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
342e0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
342f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
34300 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
34310 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
34320 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
34330 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
34340 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
34350 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
34360 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
34370 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
34380 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
34390 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
343a0 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
343b0 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
343c0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
343d0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
343e0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
343f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
34400 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
34410 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
34420 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
34430 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
34440 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
34450 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
34460 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
34470 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
34480 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
34490 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
344a0 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
344b0 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
344c0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
344d0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
344e0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
344f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
34500 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
34510 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
34520 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
34530 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
34540 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
34550 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
34560 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
34570 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
34580 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
34590 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
345a0 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
345b0 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
345c0 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
345d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
345e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
345f0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
34600 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
34610 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
34620 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
34630 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
34640 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34650 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
34660 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
34670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34680 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72  else{.        br
34690 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
346a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
346b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
346c0 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d  & pPage->nFree<=
346d0 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72  nMin ){.      br
346e0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
346f0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20        MemPage * 
34700 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20  const pParent = 
34710 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
34720 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  ge-1];.      int
34730 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43   const iIdx = pC
34740 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d  ur->aiIdx[iPage-
34750 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  1];..      rc = 
34760 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34770 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
34780 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
34790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
347a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
347b0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
347c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
347d0 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20  ge->hasData.    
347e0 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e       && pPage->n
347f0 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20  Overflow==1.    
34800 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61       && pPage->a
34810 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
34820 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  ge->nCell.      
34830 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70     && pParent->p
34840 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20  gno!=1.         
34850 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
34860 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20  l==iIdx.        
34870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
34880 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  Call balance_qui
34890 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ck() to create a
348a0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20   new sibling of 
348b0 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20  pPage on which. 
348c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
348d0 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  tore the overflo
348e0 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f  w cell. balance_
348f0 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20  quick() inserts 
34900 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20  a new cell.     
34910 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61       ** into pPa
34920 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
34930 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76  cause pParent ov
34940 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a  erflow. If this.
34950 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
34960 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69  pens, the next i
34970 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  nteration of the
34980 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
34990 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20  lance pParent . 
349a0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
349b0 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e  either balance_n
349c0 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61  onroot() or bala
349d0 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e  nce_deeper(). Un
349e0 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20  til this.       
349f0 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
34a00 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
34a10 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
34a20 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
34a30 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  pace[].         
34a40 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20   ** buffer. .   
34a50 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
34a60 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f      ** The purpo
34a70 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
34a80 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20  ing assert() is 
34a90 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e  to check that on
34aa0 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  ly a.          *
34ab0 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  * single call to
34ac0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
34ad0 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63   is made for eac
34ae0 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  h call to this. 
34af0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
34b00 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65  tion. If this we
34b10 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c  re not verified,
34b20 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e   a subtle bug in
34b30 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20  volving reuse.  
34b40 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
34b50 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
34b60 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65  pace[] might sne
34b70 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20  ak in..         
34b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
34b90 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71  sert( (balance_q
34ba0 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  uick_called++)==
34bb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
34bc0 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  c = balance_quic
34bd0 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65  k(pParent, pPage
34be0 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  , aBalanceQuickS
34bf0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  pace);.        }
34c00 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
34c10 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
34c20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
34c30 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f   call balance_no
34c40 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73  nroot() to redis
34c50 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20  tribute cells.  
34c60 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
34c70 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  en pPage and up 
34c80 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c  to 2 of its sibl
34c90 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
34ca0 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20  involves.       
34cb0 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20     ** modifying 
34cc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
34cd0 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
34ce0 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
34cf0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
34d00 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
34d10 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54   or underfull. T
34d20 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
34d30 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
34d40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69  .          ** wi
34d50 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  ll balance the p
34d60 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f  arent page to co
34d70 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20  rrect this..    
34d80 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
34d90 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61      ** If the pa
34da0 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
34db0 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20  s overfull, the 
34dc0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72  overflow cell or
34dd0 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
34de0 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69   ** are stored i
34df0 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  n the pSpace buf
34e00 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d  fer allocated im
34e10 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e  mediately below.
34e20 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41   .          ** A
34e30 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
34e40 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
34e50 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  loop will deal w
34e60 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20  ith this by.    
34e70 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
34e80 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34e90 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  () (balance_deep
34ea0 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  er() may be call
34eb0 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20  ed first,.      
34ec0 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f      ** but it do
34ed0 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20  esn't deal with 
34ee0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d  overflow cells -
34ef0 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d   just moves them
34f00 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20   to a.          
34f10 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  ** different pag
34f20 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75  e). Once this su
34f30 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
34f40 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34f50 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  () .          **
34f60 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20   has completed, 
34f70 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
34f80 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65  lease the pSpace
34f90 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a   buffer used by.
34fa0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
34fb0 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20   previous call, 
34fc0 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  as the overflow 
34fd0 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68  cell data will h
34fe0 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20  ave been .      
34ff0 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69      ** copied ei
35000 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f  ther into the bo
35010 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  dy of a database
35020 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68   page or into th
35030 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20  e new.          
35040 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ** pSpace buffer
35050 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c   passed to the l
35060 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61  atter call to ba
35070 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
35080 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
35090 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61          u8 *pSpa
350a0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
350b0 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74  Malloc(pCur->pBt
350c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
350d0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
350e0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72  nce_nonroot(pPar
350f0 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63  ent, iIdx, pSpac
35100 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20  e, iPage==1);.  
35110 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
35120 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
35130 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20   /* If pFree is 
35140 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
35150 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63  nts to the pSpac
35160 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20  e buffer used . 
35170 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79             ** by
35180 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
35190 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
351a0 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65  oot(). Its conte
351b0 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  nts are.        
351c0 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65      ** now store
351d0 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c  d either on real
351e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
351f0 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20  or within the . 
35200 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65             ** ne
35210 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c  w pSpace buffer,
35220 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61   so it may be sa
35230 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e  fely freed here.
35240 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
35250 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
35260 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  pFree);.        
35270 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
35280 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
35290 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65  fer will be free
352a0 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74  d after the next
352b0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
352c0 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f     ** balance_no
352d0 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74  nroot(), or just
352e0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
352f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77  ction returns, w
35300 68 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20  hichever.       
35310 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73     ** comes firs
35320 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
35330 70 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a  pFree = pSpace;.
35340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35350 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  }..      pPage->
35360 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
35370 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35380 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
35390 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e  he do-loop balan
353a0 63 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70  ces the parent p
353b0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  age. */.      re
353c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
353d0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50  ;.      pCur->iP
353e0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
353f0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
35400 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
35410 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
35420 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
35430 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
35440 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
35450 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
35460 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
35470 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
35480 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
35490 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
354a0 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
354b0 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
354c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
354d0 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
354e0 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
354f0 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
35500 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
35510 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
35520 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
35530 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
35540 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
35550 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
35560 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
35570 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
35580 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
35590 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
355a0 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
355b0 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
355c0 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
355d0 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
355e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
355f0 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
35600 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
35610 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  en a successful 
35620 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74  call to.** Movet
35630 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73  oUnpacked() to s
35640 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20  eek cursor pCur 
35650 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20  to (pKey, nKey) 
35660 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
35670 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73  een performed. s
35680 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65  eekResult is the
35690 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72   search result r
356a0 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74  eturned (a negat
356b0 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66  ive.** number if
356c0 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
356d0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73  an entry that is
356e0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70   smaller than (p
356f0 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a  Key, nKey), or.*
35700 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  * a positive val
35710 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  ue if pCur point
35720 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61  s at an etry tha
35730 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
35740 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79   .** (pKey, nKey
35750 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  )). .**.** If th
35760 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
35770 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
35780 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ro, then the cal
35790 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
357a0 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43  hat.** cursor pC
357b0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 61  ur is pointing a
357c0 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  t the existing c
357d0 6f 70 79 20 6f 66 20 61 20 72 6f 77 20 74 68 61  opy of a row tha
357e0 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76  t is to be.** ov
357f0 65 72 77 72 69 74 74 65 6e 2e 20 20 49 66 20 74  erwritten.  If t
35800 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
35810 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
35820 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d  en cursor pCur m
35830 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ay.** point to a
35840 6e 79 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e  ny entry or to n
35850 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 20 61  o entry at all a
35860 6e 64 20 73 6f 20 74 68 69 73 20 66 75 6e 63 74  nd so this funct
35870 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b 0a  ion has to seek.
35880 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  ** the cursor be
35890 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65 79  fore the new key
358a0 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65 64   can be inserted
358b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
358c0 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
358d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
358f0 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
35900 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
35910 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
35920 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
35930 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
35940 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
35950 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
35960 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
35970 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  ta, int nData,  
35980 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
35990 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
359a0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
359d0 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20  xtra 0 bytes to 
359e0 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
359f0 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69  /.  int appendBi
35a00 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  as,             
35a10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
35a20 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20  is is likely an 
35a30 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
35a40 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20 20  seekResult      
35a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
35a60 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f  sult of prior Mo
35a70 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 63  vetoUnpacked() c
35a80 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
35a90 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
35aa0 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 20 20  seekResult;     
35ab0 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f       /* -1: befo
35ac0 72 65 20 64 65 73 69 72 65 64 20 6c 6f 63 61 74  re desired locat
35ad0 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65 72 20 2a  ion  +1: after *
35ae0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  /.  int szNew;. 
35af0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
35b00 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
35b10 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
35b20 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
35b30 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35b40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35b50 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
35b60 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
35b70 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
35b80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
35b90 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
35ba0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
35bb0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
35bc0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72  _OK );.    retur
35bd0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
35be0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
35bf0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
35c00 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
35c10 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
35c20 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
35c30 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
35c40 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65  RITE && !pBt->re
35c50 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
35c60 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
35c70 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70  heTableLock(p, p
35c80 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
35c90 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30  Cur->pKeyInfo!=0
35ca0 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  , 2) );..  /* As
35cb0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
35cc0 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f  ller has been co
35cd0 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69  nsistent. If thi
35ce0 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  s cursor was ope
35cf0 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69  ned.  ** expecti
35d00 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  ng an index b-tr
35d10 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ee, then the cal
35d20 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
35d30 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a  serting blob.  *
35d40 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61  * keys with no a
35d50 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
35d60 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  If the cursor wa
35d70 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69  s opened expecti
35d80 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65  ng an.  ** intke
35d90 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c  y table, the cal
35da0 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
35db0 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20  serting integer 
35dc0 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a  keys with a.  **
35dd0 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61   blob of associa
35de0 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  ted data.  */.  
35df0 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30  assert( (pKey==0
35e00 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
35e10 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
35e20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
35e30 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
35e40 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
35e50 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
35e60 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20  b .  ** cursors 
35e70 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
35e80 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28  being replaced (
35e90 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73  assuming this is
35ea0 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20   a replace.  ** 
35eb0 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69  operation - if i
35ec0 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f  t is not, the fo
35ed0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d  llowing is a no-
35ee0 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  op).  */.  if( p
35ef0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
35f00 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
35f10 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
35f20 73 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20  s(p, nKey, 0);. 
35f30 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
35f40 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
35f50 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
35f60 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
35f70 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
35f80 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68  n some cases, th
35f90 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d  e call to btreeM
35fa0 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73  oveto() below is
35fb0 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20   a no-op. For.  
35fc0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  ** example, when
35fd0 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20   inserting data 
35fe0 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74  into a table wit
35ff0 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64  h auto-generated
36000 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65   integer.  ** ke
36010 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79  ys, the VDBE lay
36020 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  er invokes sqlit
36030 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f  e3BtreeLast() to
36040 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
36050 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65  .  ** integer ke
36060 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65  y to use. It the
36070 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  n calls this fun
36080 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c  ction to actuall
36090 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20  y insert the .  
360a0 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  ** data into the
360b0 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20   intkey B-Tree. 
360c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72  In this case btr
360d0 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67  eeMoveto() recog
360e0 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  nizes.  ** that 
360f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
36100 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e  ready where it n
36110 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72  eeds to be and r
36120 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20  eturns without. 
36130 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f   ** doing any wo
36140 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77  rk. To avoid thw
36150 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74  arting these opt
36160 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69  imizations, it i
36170 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a  s important.  **
36180 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68   not to clear th
36190 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20  e cursor here.. 
361a0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41   */.  rc = saveA
361b0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
361c0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
361d0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
361e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
361f0 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63  ( !loc ){.    rc
36200 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
36210 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  Cur, pKey, nKey,
36220 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
36230 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
36240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
36250 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
36260 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
36270 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65  ALID || (pCur->e
36280 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
36290 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b  VALID && loc) );
362a0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
362b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
362c0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
362d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c   pPage->intKey |
362e0 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61  | nKey>=0 );.  a
362f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
36300 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e  af || !pPage->in
36310 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45  tKey );..  TRACE
36320 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65  (("INSERT: table
36330 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64  =%d nkey=%lld nd
36340 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25  ata=%d page=%d %
36350 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
36360 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
36370 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61  nKey, nData, pPa
36380 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  ge->pgno,.      
36390 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76      loc==0 ? "ov
363a0 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20  erwrite" : "new 
363b0 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65  entry"));.  asse
363c0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
363d0 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54  t );.  allocateT
363e0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
363f0 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e   newCell = pBt->
36400 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28  pTmpSpace;.  if(
36410 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65   newCell==0 ) re
36420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
36430 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e  M;.  rc = fillIn
36440 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43  Cell(pPage, newC
36450 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ell, pKey, nKey,
36460 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   pData, nData, n
36470 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20  Zero, &szNew);. 
36480 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
36490 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73  nd_insert;.  ass
364a0 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c  ert( szNew==cell
364b0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e  SizePtr(pPage, n
364c0 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73  ewCell) );.  ass
364d0 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43  ert( szNew<=MX_C
364e0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
364f0 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  .  idx = pCur->a
36500 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
36510 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20  ];.  if( loc==0 
36520 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64  ){.    u16 szOld
36530 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
36540 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
36550 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
36560 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
36570 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36580 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
36590 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
365a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
365b0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
365c0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
365d0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
365e0 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  f ){.      memcp
365f0 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65  y(newCell, oldCe
36600 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 4);.    }.  
36610 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69    szOld = cellSi
36620 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64  zePtr(pPage, old
36630 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  Cell);.    rc = 
36640 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
36650 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64   oldCell);.    d
36660 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
36670 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b  dx, szOld, &rc);
36680 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
36690 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
366a0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
366b0 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
366c0 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
366d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
366e0 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
366f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
36700 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page];.  }else{.
36710 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36720 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
36730 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
36740 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
36750 20 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72   szNew, 0, 0, &r
36760 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  c);.  assert( rc
36770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
36780 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
36790 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
367a0 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  w>0 );..  /* If 
367b0 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
367c0 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68  ured and pPage h
367d0 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  as an overflow c
367e0 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ell, call balanc
367f0 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64  e() .  ** to red
36800 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65  istribute the ce
36810 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  lls within the t
36820 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e  ree. Since balan
36830 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20  ce() may move.  
36840 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a  ** the cursor, z
36850 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72  ero the BtCursor
36860 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20  .info.nSize and 
36870 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b  BtCursor.validNK
36880 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ey.  ** variable
36890 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65  s..  **.  ** Pre
368a0 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
368b0 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20  f SQLite called 
368c0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20  moveToRoot() to 
368d0 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a  move the cursor.
368e0 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65    ** back to the
368f0 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61   root page as ba
36900 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20  lance() used to 
36910 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
36920 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
36930 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b  BtCursor.apPage[
36940 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61  ] and BtCursor.a
36950 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20  iIdx[]. Instead 
36960 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20  of doing that,. 
36970 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73   ** set the curs
36980 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76  or state to "inv
36990 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65  alid". This make
369a0 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20  s common insert 
369b0 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  operations.  ** 
369c0 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e  slightly faster.
369d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
369e0 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
369f0 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
36a00 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
36a10 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
36a20 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
36a30 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
36a40 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
36a50 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
36a60 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
36a70 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
36a80 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
36a90 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
36aa0 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
36ab0 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
36ac0 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
36ad0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
36ae0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
36af0 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
36b00 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
36b10 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
36b20 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
36b30 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
36b40 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
36b50 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
36b60 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
36b70 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
36b80 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
36b90 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
36ba0 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
36bb0 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
36bc0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
36bd0 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
36be0 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
36bf0 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
36c00 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
36c10 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
36c20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
36c30 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
36c40 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
36c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36c60 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
36c70 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20  rflow ){.    rc 
36c80 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
36c90 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61  ..    /* Must ma
36ca0 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
36cb0 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
36cc0 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
36cd0 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20  alance().    ** 
36ce0 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20  fails. Internal 
36cf0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
36d00 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
36d10 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
36d20 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73   .    ** Also, s
36d30 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
36d40 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20  ate to invalid. 
36d50 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43  This stops saveC
36d60 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
36d70 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
36d80 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63  ng to save the c
36d90 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
36da0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
36db0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  */.    pCur->apP
36dc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
36dd0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
36de0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
36df0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
36e00 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ID;.  }.  assert
36e10 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
36e20 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
36e30 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e  erflow==0 );..en
36e40 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
36e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36e60 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
36e70 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
36e80 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
36e90 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
36ea0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
36eb0 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
36ec0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
36ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
36ee0 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
36ef0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20  ur){.  Btree *p 
36f00 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
36f10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
36f20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
36f30 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63         .  int rc
36f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36f60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
36f70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
36f80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
36f90 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36fa0 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66  to delete cell f
36fb0 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rom */.  unsigne
36fc0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20  d char *pCell;  
36fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36fe0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
36ff0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
37000 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20  int iCellIdx;   
37010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37020 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
37030 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
37040 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65  */.  int iCellDe
37050 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
37060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
37070 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61  th of node conta
37080 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a  ining pCell */ .
37090 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
370a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
370b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
370c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
370d0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
370e0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
370f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
37100 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
37110 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74  Flag );.  assert
37120 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
37130 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
37140 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
37150 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
37160 32 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  2) );.  assert( 
37170 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
37180 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
37190 6f 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  oot) );..  if( N
371a0 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
371b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
371c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
371d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29  ->iPage]->nCell)
371e0 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43   .   || NEVER(pC
371f0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
37200 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20  OR_VALID).  ){. 
37210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37220 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65  _ERROR;  /* Some
37230 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
37240 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  wry. */.  }..  /
37250 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
37260 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
37270 74 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20  to remove a row 
37280 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74  from a table b-t
37290 72 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69  ree,.  ** invali
372a0 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
372b0 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
372c0 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
372d0 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69  deleted.  */.  i
372e0 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
372f0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
37300 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
37310 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 69  rsors(p, pCur->i
37320 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  nfo.nKey, 0);.  
37330 7d 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20  }..  iCellDepth 
37340 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
37350 20 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72   iCellIdx = pCur
37360 2d 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70  ->aiIdx[iCellDep
37370 74 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  th];.  pPage = p
37380 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
37390 6c 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c  lDepth];.  pCell
373a0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
373b0 65 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20  e, iCellIdx);.. 
373c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
373d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
373e0 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69  ntry to delete i
373f0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
37400 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  e, move.  ** the
37410 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
37420 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20  argest entry in 
37430 74 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73  the tree that is
37440 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20   smaller than.  
37450 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69  ** the entry bei
37460 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
37470 20 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61   cell will repla
37480 63 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  ce the cell bein
37490 67 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66  g deleted.  ** f
374a0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
374b0 20 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76   node. The 'prev
374c0 69 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75  ious' entry is u
374d0 73 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73  sed for this ins
374e0 74 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tead.  ** of the
374f0 20 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61   'next' entry, a
37500 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  s the previous e
37510 6e 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61  ntry is always a
37520 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a   part of the.  *
37530 2a 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  * sub-tree heade
37540 64 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70  d by the child p
37550 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  age of the cell 
37560 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54  being deleted. T
37570 68 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62  his makes.  ** b
37580 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65  alancing the tre
37590 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
375a0 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e  delete operation
375b0 20 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69   easier.  */.  i
375c0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
375d0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  ){.    int notUs
375e0 65 64 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ed;.    rc = sql
375f0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
37600 73 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  s(pCur, &notUsed
37610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
37620 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
37630 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
37640 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
37650 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
37660 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
37670 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69  before.  ** maki
37680 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ng any modificat
37690 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70  ions. Make the p
376a0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
376b0 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a  he entry to be .
376c0 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69    ** deleted wri
376d0 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65  table. Then free
376e0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
376f0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
37700 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e  ith the .  ** en
37710 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  try and finally 
37720 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20  remove the cell 
37730 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68  itself from with
37740 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a 20  in the page.  . 
37750 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41   */.  rc = saveA
37760 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
37770 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
37780 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
37790 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
377a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
377b0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
377c0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
377d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
377e0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
377f0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 64 72  ge, pCell);.  dr
37800 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  opCell(pPage, iC
37810 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69 7a 65  ellIdx, cellSize
37820 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
37830 29 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 72  ), &rc);.  if( r
37840 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
37850 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
37860 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74   deleted was not
37870 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65   located on a le
37880 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  af page, then th
37890 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73  e cursor.  ** is
378a0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
378b0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65  ing to the large
378c0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
378d0 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a  sub-tree headed.
378e0 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c    ** by the chil
378f0 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65  d-page of the ce
37900 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74  ll that was just
37910 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e   deleted from an
37920 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
37930 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72  ode. The cell fr
37940 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  om the leaf node
37950 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76   needs to be mov
37960 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
37970 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20  al.  ** node to 
37980 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65  replace the dele
37990 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  ted cell.  */.  
379a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
379b0 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
379c0 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61  *pLeaf = pCur->a
379d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
379e0 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c  e];.    int nCel
379f0 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20  l;.    Pgno n = 
37a00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65  pCur->apPage[iCe
37a10 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f  llDepth+1]->pgno
37a20 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
37a30 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20  har *pTmp;..    
37a40 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
37a50 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
37a60 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65  Cell-1);.    nCe
37a70 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
37a80 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a  (pLeaf, pCell);.
37a90 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
37aa0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e  ELL_SIZE(pBt)>=n
37ab0 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c  Cell );..    all
37ac0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
37ad0 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20  Bt);.    pTmp = 
37ae0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
37af0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37b00 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61  3PagerWrite(pLea
37b10 66 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  f->pDbPage);.   
37b20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
37b30 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 70 43 65  e, iCellIdx, pCe
37b40 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70  ll-4, nCell+4, p
37b50 54 6d 70 2c 20 6e 2c 20 26 72 63 29 3b 0a 20 20  Tmp, n, &rc);.  
37b60 20 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66    dropCell(pLeaf
37b70 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31  , pLeaf->nCell-1
37b80 2c 20 6e 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , nCell, &rc);. 
37b90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37ba0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
37bb0 20 42 61 6c 61 6e 63 65 20 74 68 65 20 74 72 65   Balance the tre
37bc0 65 2e 20 49 66 20 74 68 65 20 65 6e 74 72 79 20  e. If the entry 
37bd0 64 65 6c 65 74 65 64 20 77 61 73 20 6c 6f 63 61  deleted was loca
37be0 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61  ted on a leaf pa
37bf0 67 65 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ge,.  ** then th
37c00 65 20 63 75 72 73 6f 72 20 73 74 69 6c 6c 20 70  e cursor still p
37c10 6f 69 6e 74 73 20 74 6f 20 74 68 61 74 20 70 61  oints to that pa
37c20 67 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ge. In this case
37c30 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
37c40 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 28  call to balance(
37c50 29 20 72 65 70 61 69 72 73 20 74 68 65 20 74 72  ) repairs the tr
37c60 65 65 2c 20 61 6e 64 20 74 68 65 20 69 66 28 2e  ee, and the if(.
37c70 2e 2e 29 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ..) condition is
37c80 0a 20 20 2a 2a 20 6e 65 76 65 72 20 74 72 75 65  .  ** never true
37c90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65  ..  **.  ** Othe
37ca0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 65 6e  rwise, if the en
37cb0 74 72 79 20 64 65 6c 65 74 65 64 20 77 61 73 20  try deleted was 
37cc0 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  on an internal n
37cd0 6f 64 65 20 70 61 67 65 2c 20 74 68 65 6e 0a 20  ode page, then. 
37ce0 20 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e   ** pCur is poin
37cf0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 65 61 66  ting to the leaf
37d00 20 70 61 67 65 20 66 72 6f 6d 20 77 68 69 63 68   page from which
37d10 20 61 20 63 65 6c 6c 20 77 61 73 20 72 65 6d 6f   a cell was remo
37d20 76 65 64 20 74 6f 0a 20 20 2a 2a 20 72 65 70 6c  ved to.  ** repl
37d30 61 63 65 20 74 68 65 20 63 65 6c 6c 20 64 65 6c  ace the cell del
37d40 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  eted from the in
37d50 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 69  ternal node. Thi
37d60 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
37d70 2a 2a 20 74 72 69 63 6b 79 20 61 73 20 74 68 65  ** tricky as the
37d80 20 6c 65 61 66 20 6e 6f 64 65 20 6d 61 79 20 62   leaf node may b
37d90 65 20 75 6e 64 65 72 66 75 6c 6c 2c 20 61 6e 64  e underfull, and
37da0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
37db0 64 65 20 6d 61 79 0a 20 20 2a 2a 20 62 65 20 65  de may.  ** be e
37dc0 69 74 68 65 72 20 75 6e 64 65 72 20 6f 72 20 6f  ither under or o
37dd0 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
37de0 20 63 61 73 65 20 72 75 6e 20 74 68 65 20 62 61   case run the ba
37df0 6c 61 6e 63 69 6e 67 20 61 6c 67 6f 72 69 74 68  lancing algorith
37e00 6d 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  m.  ** on the le
37e10 61 66 20 6e 6f 64 65 20 66 69 72 73 74 2e 20 49  af node first. I
37e20 66 20 74 68 65 20 62 61 6c 61 6e 63 65 20 70 72  f the balance pr
37e30 6f 63 65 65 64 73 20 66 61 72 20 65 6e 6f 75 67  oceeds far enoug
37e40 68 20 75 70 20 74 68 65 0a 20 20 2a 2a 20 74 72  h up the.  ** tr
37e50 65 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 62  ee that we can b
37e60 65 20 73 75 72 65 20 74 68 61 74 20 61 6e 79 20  e sure that any 
37e70 70 72 6f 62 6c 65 6d 20 69 6e 20 74 68 65 20 69  problem in the i
37e80 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 68 61 73  nternal node has
37e90 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 72 72 65  .  ** been corre
37ea0 63 74 65 64 2c 20 73 6f 20 62 65 20 69 74 2e 20  cted, so be it. 
37eb0 4f 74 68 65 72 77 69 73 65 2c 20 61 66 74 65 72  Otherwise, after
37ec0 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 6c   balancing the l
37ed0 65 61 66 20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77  eaf node,.  ** w
37ee0 61 6c 6b 20 74 68 65 20 63 75 72 73 6f 72 20 75  alk the cursor u
37ef0 70 20 74 68 65 20 74 72 65 65 20 74 6f 20 74 68  p the tree to th
37f00 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
37f10 61 6e 64 20 62 61 6c 61 6e 63 65 20 69 74 20 61  and balance it a
37f20 73 20 0a 20 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a  s .  ** well.  *
37f30 2f 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  /.  rc = balance
37f40 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
37f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
37f60 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
37f70 44 65 70 74 68 20 29 7b 0a 20 20 20 20 77 68 69  Depth ){.    whi
37f80 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  le( pCur->iPage>
37f90 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20 20  iCellDepth ){.  
37fa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37fb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
37fc0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
37fd0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 62 61 6c    }.    rc = bal
37fe0 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a  ance(pCur);.  }.
37ff0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
38000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
38010 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
38020 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
38030 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
38040 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
38050 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
38060 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
38070 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
38080 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
38090 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
380a0 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
380b0 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
380c0 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
380d0 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
380e0 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
380f0 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
38100 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
38110 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
38120 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
38130 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
38140 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
38150 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
38160 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
38170 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
38180 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
38190 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
381a0 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
381b0 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
381c0 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
381d0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
381e0 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
381f0 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
38200 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
38210 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
38220 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
38230 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
38240 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
38250 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
38260 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
38270 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
38280 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
38290 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
382a0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
382b0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
382c0 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
382d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
382e0 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
382f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
38300 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
38310 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
38320 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
38330 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
38340 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
38350 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
38360 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
38370 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
38380 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
38390 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
383a0 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
383b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
383c0 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
383d0 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
383e0 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
383f0 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
38400 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
38410 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
38420 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
38430 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
38440 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
38450 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
38460 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
38470 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
38480 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
38490 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
384a0 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
384b0 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
384c0 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
384d0 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2