/ Hex Artifact Content
Login

Artifact e626616c3b7501d4d79e7ff2e48743c20255b3b8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 32 35 20 32 30 30 39 2f 30  c,v 1.625 2009/0
0190: 36 2f 30 39 20 31 38 3a 35 38 3a 35 33 20 73 68  6/09 18:58:53 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 2f 2a 0a 2a 2a 20 46 6f 72  ndif.../*.** For
07c0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
07d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
07e0: 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c  heckForReadConfl
07f0: 69 63 74 73 28 42 74 72 65 65 2a 2c 20 50 67 6e  icts(Btree*, Pgn
0800: 6f 2c 20 42 74 43 75 72 73 6f 72 2a 2c 20 69 36  o, BtCursor*, i6
0810: 34 29 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  4);...#ifdef SQL
0820: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0830: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
0840: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
0850: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0860: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0870: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0880: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0890: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
08a0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
08b0: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
08c0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
08d0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
08e0: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
08f0: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
0900: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
0910: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
0920: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
0930: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
0940: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
0950: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0960: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0970: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0980: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0990: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
09a0: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
09b0: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
09c0: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
09d0: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
09e0: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
09f0: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
0a00: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
0a10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
0a20: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
0a30: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
0a40: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
0a50: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a60: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a70: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a80: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a90: 4c 6f 63 6b 73 28 61 29 0a 23 65 6e 64 69 66 0a  Locks(a).#endif.
0aa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0ab0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
0ac0: 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  E./*.** Query to
0ad0: 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68 61   see if btree ha
0ae0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
0af0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
0b00: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
0b10: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
0b20: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
0b30: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0b40: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
0b50: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
0b60: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
0b70: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
0b80: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
0b90: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
0ba0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
0bb0: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
0bc0: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
0bd0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0be0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
0bf0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
0c00: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
0c10: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
0c20: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
0c30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
0c40: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
0c50: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
0c60: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
0c70: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
0c80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
0c90: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
0ca0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
0cb0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
0cc0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
0cd0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
0ce0: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
0cf0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
0d00: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
0d10: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
0d20: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
0d30: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
0d40: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
0d50: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
0d60: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
0d70: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
0d80: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
0d90: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
0da0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
0db0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
0dc0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
0dd0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
0de0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
0df0: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
0e00: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  .  .  /* This is
0e10: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
0e20: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
0e30: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
0e40: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
0e50: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
0e60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
0e70: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
0e80: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
0e90: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
0ea0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
0eb0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
0ec0: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
0ed0: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
0ee0: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
0ef0: 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73 45 78  !=p && pBt->isEx
0f00: 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 73  clusive ){.    s
0f10: 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
0f20: 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
0f30: 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29  Bt->pWriter->db)
0f40: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
0f50: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
0f60: 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
0f70: 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69  * This (along wi
0f80: 74 68 20 73 65 74 53 68 61 72 65 64 43 61 63 68  th setSharedCach
0f90: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 20 69 73  eTableLock()) is
0fa0: 20 77 68 65 72 65 0a 20 20 2a 2a 20 74 68 65 20   where.  ** the 
0fb0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0fc0: 66 6c 61 67 20 69 73 20 64 65 61 6c 74 20 77 69  flag is dealt wi
0fd0: 74 68 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  th..  ** If the 
0fe0: 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69  caller is queryi
0ff0: 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f  ng for a read-lo
1000: 63 6b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 0a  ck on any table.
1010: 20 20 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20    ** other than 
1020: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
1030: 72 20 74 61 62 6c 65 20 28 74 61 62 6c 65 20 31  r table (table 1
1040: 29 20 61 6e 64 20 69 66 20 74 68 65 20 52 65 61  ) and if the Rea
1050: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 0a 20 20 2a  dUncommitted.  *
1060: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  * flag is set, t
1070: 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 67 72 61  hen the lock gra
1080: 6e 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  nted even if the
1090: 72 65 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63  re are write-loc
10a0: 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74  ks.  ** on the t
10b0: 61 62 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65  able. If a write
10c0: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
10d0: 65 64 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f  ed, the ReadUnco
10e0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a  mmitted flag.  *
10f0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
1100: 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  red..  **.  ** I
1110: 6e 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 53 68  n function setSh
1120: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1130: 63 6b 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d  ck(), if a read-
1140: 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64  lock is demanded
1150: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52   and the .  ** R
1160: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
1170: 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65  lag is set, no e
1180: 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
1190: 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20   the locks list 
11a0: 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e  .  ** (BtShared.
11b0: 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a  pLock)..  **.  *
11c0: 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20  * To summarize: 
11d0: 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  If the ReadUncom
11e0: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
11f0: 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75  et, then read cu
1200: 72 73 6f 72 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f  rsors.  ** on no
1210: 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  n-schema tables 
1220: 64 6f 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72  do not create or
1230: 20 72 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c   respect table l
1240: 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e  ocks. The lockin
1250: 67 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  g.  ** procedure
1260: 20 66 6f 72 20 61 20 77 72 69 74 65 2d 63 75 72   for a write-cur
1270: 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  sor does not cha
1280: 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
1290: 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e  .    0==(p->db->
12a0: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61  flags&SQLITE_Rea
12b0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c  dUncommitted) ||
12c0: 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49   .    eLock==WRI
12d0: 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69  TE_LOCK ||.    i
12e0: 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  Tab==MASTER_ROOT
12f0: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49  .  ){.    for(pI
1300: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
1310: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
1320: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1330: 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69    /* The conditi
1340: 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  on (pIter->eLock
1350: 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20  !=eLock) in the 
1360: 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e  following if(...
1370: 29 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ) .      ** stat
1380: 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c  ement is a simpl
1390: 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20  ification of:.  
13a0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
13b0: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
13c0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
13d0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
13e0: 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ).      **.     
13f0: 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f   ** since we kno
1400: 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d  w that if eLock=
1410: 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65  =WRITE_LOCK, the
1420: 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  n no other conne
1430: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d  ction.      ** m
1440: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
1450: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
1460: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
1470: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
1480: 20 20 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65        ** only be
1490: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
14a0: 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
14b0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
14c0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
14d0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63  K || pIter->eLoc
14e0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
14f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
1500: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
1510: 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  || pIter->pBtree
1520: 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  ==p || pIter->eL
1530: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b  ock==READ_LOCK);
1540: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
1550: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
1560: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
1570: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
1580: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
1590: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
15a0: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
15b0: 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72  >db, pIter->pBtr
15c0: 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  ee->db);.       
15d0: 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54   if( eLock==WRIT
15e0: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
15f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
1600: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
1610: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73           pBt->is
1620: 50 65 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Pending = 1;.   
1630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
1650: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1670: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1680: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1690: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
16a0: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
16b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16c0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16d0: 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f  E./*.** Add a lo
16e0: 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
16f0: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
1700: 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61  Table to the sha
1710: 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a  red-btree used.*
1720: 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  * by Btree handl
1730: 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65  e p. Parameter e
1740: 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74  Lock must be eit
1750: 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  her READ_LOCK or
1760: 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e   .** WRITE_LOCK.
1770: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1780: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1790: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
17a0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
17b0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
17c0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
17d0: 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75  may also be retu
17e0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
17f0: 69 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63  int setSharedCac
1800: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1810: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c  e *p, Pgno iTabl
1820: 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20  e, u8 eLock){.  
1830: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1840: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
1850: 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42   *pLock = 0;.  B
1860: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
1870: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1880: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1890: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
18a0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
18b0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
18c0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
18d0: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a  t( p->db!=0 );..
18e0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
18f0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1900: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1910: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1920: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
1930: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1940: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
1950: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  sert( SQLITE_OK=
1960: 3d 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68  =querySharedCach
1970: 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
1980: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
1990: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61  .  /* If the rea
19a0: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
19b0: 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20  ag is set and a 
19c0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71  read-lock is req
19d0: 75 65 73 74 65 64 20 6f 6e 0a 20 20 2a 2a 20 61  uested on.  ** a
19e0: 20 6e 6f 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c   non-schema tabl
19f0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  e, then the lock
1a00: 20 69 73 20 61 6c 77 61 79 73 20 67 72 61 6e 74   is always grant
1a10: 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
1a20: 79 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 61  y.  ** without a
1a30: 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74  dding an entry t
1a40: 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  o the BtShared.p
1a50: 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20  Lock list. See. 
1a60: 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66   ** comment in f
1a70: 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 53 68 61  unction querySha
1a80: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a90: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
1aa0: 6f 0a 20 20 2a 2a 20 6f 6e 20 68 61 6e 64 6c 69  o.  ** on handli
1ab0: 6e 67 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  ng the ReadUncom
1ac0: 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a  mitted flag..  *
1ad0: 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d  /.  if( .    (p-
1ae0: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
1af0: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
1b00: 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63  d) && .    (eLoc
1b10: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26  k==READ_LOCK) &&
1b20: 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53  .    iTable!=MAS
1b30: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
1b40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b50: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  OK;.  }..  /* Fi
1b60: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
1b70: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
1b80: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
1b90: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
1ba0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1bb0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1bc0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1bd0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
1be0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
1bf0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
1c00: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
1c10: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
1c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1c30: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
1c40: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
1c50: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
1c60: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
1c70: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
1c80: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
1c90: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
1ca0: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
1cb0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
1cc0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
1cd0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
1ce0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
1cf0: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
1d00: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
1d10: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
1d20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1d30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1d40: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
1d50: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
1d60: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
1d70: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
1d80: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1d90: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
1da0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
1db0: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
1dc0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
1dd0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
1de0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
1df0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
1e00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
1e10: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
1e20: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
1e30: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
1e40: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
1e50: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
1e60: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
1e70: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
1e80: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
1e90: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
1ea0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
1eb0: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
1ec0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
1ed0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
1ee0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1ef0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1f00: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
1f10: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
1f20: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1f30: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1f40: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
1f50: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
1f60: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
1f70: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
1f80: 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61  to.** the setSha
1f90: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1fa0: 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68  k() procedure) h
1fb0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
1fc0: 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  dle p..**.** Thi
1fd0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1fe0: 65 73 20 74 68 61 74 20 68 61 6e 64 6c 65 20 70  es that handle p
1ff0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61   has an open rea
2000: 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74  d or write .** t
2010: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69  ransaction. If i
2020: 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e  t does not, then
2030: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 69 73   the BtShared.is
2040: 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62 6c 65  Pending variable
2050: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
2060: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
2070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2080: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
2090: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
20a0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
20b0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20c0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
20d0: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
20e0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
20f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2100: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2110: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2120: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
2130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
2140: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
2150: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
2160: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
2170: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
2180: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
2190: 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
21a0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
21b0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a  Lock->pBtree );.
21c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
21d0: 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61  k->pBtree->inTra
21e0: 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ns>=pLock->eLock
21f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
2200: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
2210: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
2220: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
2230: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2240: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  (pLock);.    }el
2250: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
2260: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
2270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
2280: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
2290: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
22a0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
22b0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
22c0: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
22d0: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
22e0: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
22f0: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
2300: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
2310: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
2320: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
2330: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
2340: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2350: 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  when connection 
2360: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
2370: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
2380: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
2390: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
23a0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
23b0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
23c0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
23d0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
23e0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
23f0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
2400: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
2410: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
2420: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
2430: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
2440: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
2450: 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61  he isPending fla
2460: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
2470: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2480: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
2490: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
24a0: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
24b0: 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  g must.    ** be
24c0: 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53   zero already. S
24d0: 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65  o this next line
24e0: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20   is harmless in 
24f0: 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
2500: 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  /.    pBt->isPen
2510: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ding = 0;.  }.}.
2520: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2530: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2540: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
2550: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
2560: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
2570: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
2580: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
2590: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
25a0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d  cursor holds a m
25b0: 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
25c0: 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ared.*/.#ifndef 
25d0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
25e0: 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  t cursorHoldsMut
25f0: 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ex(BtCursor *p){
2600: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2610: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
2620: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  pBt->mutex);.}.#
2630: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
2640: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2650: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  BLOB./*.** Inval
2660: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
2670: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
2680: 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43  he for cursor pC
2690: 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73  ur, if any..*/.s
26a0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
26b0: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
26c0: 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  he(BtCursor *pCu
26d0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
26e0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26f0: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
2700: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
2710: 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
2720: 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >aOverflow = 0;.
2730: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
2740: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
2750: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
2760: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
2770: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68   opened.** on th
2780: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
2790: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
27a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
27b0: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
27c0: 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64  owCache(BtShared
27d0: 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
27e0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
27f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2800: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2810: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
2820: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
2830: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76  >pNext){.    inv
2840: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2850: 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23  ache(p);.  }.}.#
2860: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69  else.  #define i
2870: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
2880: 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66  wCache(x).  #def
2890: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ine invalidateAl
28a0: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  lOverflowCache(x
28b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
28c0: 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20  Set bit pgno of 
28d0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
28e0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
28f0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
2900: 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20  .** when a page 
2910: 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20  that previously 
2920: 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62  contained data b
2930: 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69  ecomes a free-li
2940: 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65  st leaf .** page
2950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68  ..**.** The BtSh
2960: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
2970: 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74   bitvec exists t
2980: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e  o work around an
2990: 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20   obscure.** bug 
29a0: 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  caused by the in
29b0: 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f  teraction of two
29c0: 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d   useful IO optim
29d0: 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e  izations surroun
29e0: 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73  ding.** free-lis
29f0: 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a  t leaf pages:.**
2a00: 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c  .**   1) When al
2a10: 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65  l data is delete
2a20: 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e  d from a page an
2a30: 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d  d the page becom
2a40: 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65  es.**      a fre
2a50: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
2a60: 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  , the page is no
2a70: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
2a80: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
2a90: 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20    (as free-list 
2aa0: 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61  leaf pages conta
2ab0: 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c  in no meaningful
2ac0: 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65   data). Sometime
2ad0: 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61  s.**      such a
2ae0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65   page is not eve
2af0: 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73  n journalled (as
2b00: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2b10: 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20  modified,.**    
2b20: 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75    why bother jou
2b30: 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a  rnalling it?)..*
2b40: 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61  *.**   2) When a
2b50: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
2b60: 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20  page is reused, 
2b70: 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  its content is n
2b80: 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ot read.**      
2b90: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2ba0: 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20  e or written to 
2bb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2bc0: 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a   (why should it.
2bd0: 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69  **      be, if i
2be0: 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  t is not at all 
2bf0: 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a  meaningful?)..**
2c00: 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65  .** By themselve
2c10: 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  s, these optimiz
2c20: 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65  ations work fine
2c30: 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68   and provide a h
2c40: 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  andy.** performa
2c50: 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c  nce boost to bul
2c60: 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65  k delete or inse
2c70: 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48  rt operations. H
2c80: 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20  owever, if.** a 
2c90: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f  page is moved to
2ca0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
2cb0: 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77  nd then reused w
2cc0: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a  ithin the same.*
2cd0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  * transaction, a
2ce0: 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75   problem comes u
2cf0: 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  p. If the page i
2d00: 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  s not journalled
2d10: 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d   when.** it is m
2d20: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
2d30: 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20  -list and it is 
2d40: 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  also not journal
2d50: 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69  led when it.** i
2d60: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
2d70: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
2d80: 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20  nd reused, then 
2d90: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
2da0: 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74  a.** may be lost
2db0: 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  . In the event o
2dc0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  f a rollback, it
2dd0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73   may not be poss
2de0: 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  ible.** to resto
2df0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2e00: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
2e10: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
2e20: 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f  *.** The solutio
2e30: 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65  n is the BtShare
2e40: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
2e50: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
2e60: 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76   page is .** mov
2e70: 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66  ed to become a f
2e80: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
2e90: 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ge, the correspo
2ea0: 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20  nding bit is.** 
2eb0: 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65  set in the bitve
2ec0: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65  c. Whenever a le
2ed0: 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61  af page is extra
2ee0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
2ef0: 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69  ee-list,.** opti
2f00: 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65  mization 2 above
2f10: 20 69 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20   is ommitted if 
2f20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
2f30: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
2f40: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
2f50: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
2f60: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2f70: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
2f80: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
2f90: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
2fa0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
2fc0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
2fd0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
2fe0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
2ff0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
3000: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
3010: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ntent ){.    int
3020: 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d   nPage;.    rc =
3030: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
3040: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
3050: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
3060: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
3070: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  OK ){.      pBt-
3080: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73  >pHasContent = s
3090: 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
30a0: 74 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a  te((u32)nPage);.
30b0: 20 20 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e        if( !pBt->
30c0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
30d0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
30f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
3100: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3110: 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33  && pgno<=sqlite3
3120: 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e  BitvecSize(pBt->
3130: 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a  pHasContent) ){.
3140: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3150: 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70  BitvecSet(pBt->p
3160: 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f  HasContent, pgno
3170: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3180: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  rc;.}../*.** Que
3190: 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ry the BtShared.
31a0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74  pHasContent vect
31b0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  or..**.** This f
31c0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31d0: 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  d when a free-li
31e0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
31f0: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
3200: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f  .** free-list fo
3210: 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75  r reuse. It retu
3220: 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20  rns false if it 
3230: 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69  is safe to retri
3240: 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  eve the.** page 
3250: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
3260: 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
3270: 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
3280: 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77  set. True otherw
3290: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
32a0: 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f  nt btreeGetHasCo
32b0: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
32c0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
32d0: 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70  .  Bitvec *p = p
32e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b  Bt->pHasContent;
32f0: 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
3300: 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74  (pgno>sqlite3Bit
3310: 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71  vecSize(p) || sq
3320: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
3330: 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f  p, pgno)));.}../
3340: 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74  *.** Clear (dest
3350: 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65  roy) the BtShare
3360: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
3370: 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c  tvec. This shoul
3380: 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  d be.** invoked 
3390: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
33a0: 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d  n of each write-
33b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
33c0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
33d0: 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
33e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
33f0: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
3400: 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61  Destroy(pBt->pHa
3410: 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74  sContent);.  pBt
3420: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
3430: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  0;.}../*.** Save
3440: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
3450: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  sor position in 
3460: 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74  the variables Bt
3470: 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20  Cursor.nKey .** 
3480: 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65  and BtCursor.pKe
3490: 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20  y. The cursor's 
34a0: 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
34b0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
34c0: 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EK..*/.static in
34d0: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
34e0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
34f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
3500: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
3510: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
3520: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
3530: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
3540: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
3550: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
3560: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
3570: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
3580: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
3590: 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66  >nKey);..  /* If
35a0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
35b0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
35c0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
35d0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
35e0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
35f0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
3600: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
3610: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
3620: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
3630: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
3640: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
3650: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
3660: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
3670: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
3680: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
3690: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
36a0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
36b0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
36c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
36d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
36e0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
36f0: 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f  >intKey){.    vo
3700: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
3710: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
3720: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
3730: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
3740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
3750: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
3760: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
3770: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
3780: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3790: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
37a0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
37b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
37d0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
37e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
3800: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
3810: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
3820: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
3830: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
3840: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
3850: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
3860: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
3870: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
3880: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
3890: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
38a0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
38b0: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
38c0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
38d0: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
38e0: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
38f0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
3900: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
3910: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3920: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
3930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3940: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
3950: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
3960: 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20   cursors except 
3970: 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20  pExcept open on 
3980: 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69  the table .** wi
3990: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
39a0: 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  ot. Usually, thi
39b0: 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  s is called just
39c0: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a   before cursor.*
39d0: 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65  * pExcept is use
39e0: 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  d to modify the 
39f0: 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65  table (BtreeDele
3a00: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
3a10: 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ert())..*/.stati
3a20: 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72  c int saveAllCur
3a30: 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
3a40: 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  Bt, Pgno iRoot, 
3a50: 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70  BtCursor *pExcep
3a60: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a70: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3aa0: 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74   assert( pExcept
3ab0: 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e  ==0 || pExcept->
3ac0: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f  pBt==pBt );.  fo
3ad0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3ae0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3af0: 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78  {.    if( p!=pEx
3b00: 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f  cept && (0==iRoo
3b10: 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74  t || p->pgnoRoot
3b20: 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20  ==iRoot) && .   
3b30: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
3b40: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
3b50: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73        int rc = s
3b60: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
3b70: 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(p);.      if( 
3b80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
3b90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3ba0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
3bb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
3bc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3bd0: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
3be0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
3bf0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3c00: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
3c10: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
3c20: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
3c30: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3c40: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
3c50: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3c60: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
3c70: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
3c80: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
3c90: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
3ca0: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
3cb0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
3cc0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
3cd0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
3ce0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
3cf0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
3d00: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
3d10: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
3d20: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
3d30: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
3d40: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
3d50: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
3d60: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
3d70: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
3d80: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
3d90: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
3da0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
3db0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
3dc0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
3dd0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  ition()..*/.int 
3de0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74  sqlite3BtreeRest
3df0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
3e00: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
3e10: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
3e20: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3e30: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
3e40: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
3e50: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
3e60: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
3e70: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
3e80: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
3e90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
3ea0: 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
3eb0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
3ec0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
3ed0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3ee0: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
3ef0: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
3f00: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
3f10: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
3f20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3f30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3f40: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
3f50: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
3f60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
3f70: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
3f80: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
3f90: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3fa0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
3fb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
3fc0: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
3fd0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
3fe0: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
3ff0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
4000: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
4010: 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74  sqlite3BtreeRest
4020: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
4030: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
4040: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
4050: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
4060: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
4070: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
4080: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
4090: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
40a0: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
40b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
40c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
40d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
40e0: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
40f0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
4100: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
4110: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
4120: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
4130: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4140: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
4150: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
4160: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
4170: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
4180: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
4190: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
41a0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
41b0: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
41c0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
41d0: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
41e0: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
41f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
4200: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
4210: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
4220: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
4230: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
4240: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
4250: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
4260: 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20  r->skip!=0 ){.  
4270: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31    *pHasMoved = 1
4280: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
4290: 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  pHasMoved = 0;. 
42a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
42b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
42c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
42d0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
42e0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
42f0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
4300: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
4310: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
4320: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
4330: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
4340: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
4350: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
4360: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
4370: 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  number..*/.stati
4380: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
4390: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
43a0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
43b0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
43c0: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
43d0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
43e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
43f0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4400: 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73  tex) );.  nPages
4410: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
4420: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
4430: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
4440: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
4450: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
4460: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
4470: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
4480: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
4490: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
44a0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
44b0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
44c0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
44d0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
44e0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
44f0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
4500: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
4510: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
4520: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
4530: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
4540: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
4550: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
4560: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
4570: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
4580: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
4590: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
45a0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
45b0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
45c0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
45d0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
45e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
45f0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
4600: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
4610: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
4620: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
4630: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
4640: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
4650: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
4660: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
4670: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
4680: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
4690: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
46a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
46b0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
46c0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
46d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
46e0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
46f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
4700: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
4710: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
4720: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
4730: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
4740: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
4750: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
4760: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
4770: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
4780: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
4790: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
47a0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
47b0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
47c0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
47d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
47e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
47f0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
4800: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
4810: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
4820: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
4830: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
4840: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
4850: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
4870: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
4880: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
4890: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
48a0: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
48b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
48c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
48d0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
48e0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
48f0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
4900: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
4910: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
4920: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
4930: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4940: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
4950: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
4960: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
4970: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
4980: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
4990: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
49a0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
49b0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
49c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
49d0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
49e0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
49f0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
4a00: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
4a10: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
4a20: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67   }..  sqlite3Pag
4a30: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
4a40: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
4a60: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
4a70: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
4a80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
4a90: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
4aa0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
4ab0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
4ac0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
4ad0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
4ae0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
4af0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
4b00: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
4b10: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4b20: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4b30: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b40: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4b50: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4b60: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
4b70: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b80: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
4b90: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
4ba0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
4bb0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
4bc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
4bd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
4be0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
4bf0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
4c00: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
4c10: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
4c20: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
4c30: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
4c40: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
4c50: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
4c60: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
4c70: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4c80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4c90: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4ca0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
4cb0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
4cc0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
4cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
4ce0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
4cf0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
4d00: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
4d10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
4d20: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
4d30: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
4d40: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
4d50: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
4d60: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
4d70: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
4d80: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  y);.  assert( pE
4d90: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
4da0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
4db0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
4dc0: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
4dd0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4de0: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
4df0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
4e00: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
4e10: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
4e20: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
4e30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
4e40: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
4e50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
4e60: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
4e70: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
4e80: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
4e90: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
4ea0: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4eb0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4ec0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
4ed0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
4ee0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
4ef0: 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  l(y,z) SQLITE_OK
4f00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
4f10: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
4f20: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
4f30: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
4f40: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
4f50: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
4f60: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
4f70: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
4f80: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
4f90: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
4fa0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
4fb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
4fc0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
4fd0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
4fe0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
4ff0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
5000: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
5010: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
5020: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
5030: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
5040: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
5050: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
5060: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
5070: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
5080: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
5090: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
50a0: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
50b0: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
50c0: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
50d0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
50e0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
50f0: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
5100: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
5110: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
5120: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5130: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5140: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5150: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
5160: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
5170: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
5180: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
5190: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
51a0: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
51b0: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
51c0: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
51d0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
51e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
51f0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
5200: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
5210: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
5220: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
5230: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5240: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
5250: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
5260: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
5270: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
5280: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
5290: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
52a0: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
52b0: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
52c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
52d0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
52e0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
52f0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
5300: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
5310: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
5320: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
5330: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
5340: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
5350: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
5360: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
5370: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
5380: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
5390: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
53a0: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
53b0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
53c0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
53d0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
53e0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
53f0: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
5400: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
5410: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
5420: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
5430: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
5440: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
5450: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
5460: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5480: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
5490: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
54a0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
54b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
54c0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
54d0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
5500: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
5510: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
5520: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
5530: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5540: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
5550: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
5560: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5570: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
5580: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
5590: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
55a0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
55b0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
55c0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
55d0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
55e0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
55f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
5600: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
5610: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
5620: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
5630: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
5640: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
5650: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
5660: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
5670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5680: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
5690: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
56a0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
56b0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
56c0: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
56d0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
56e0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
56f0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
5700: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
5710: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
5720: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
5730: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
5740: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
5750: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
5760: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
5770: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
5780: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
5790: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
57a0: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
57b0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
57c0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
57d0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
57e0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
57f0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
5800: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
5810: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
5820: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5830: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
5840: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
5850: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
5860: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
5870: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
5880: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
5890: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
58a0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
58b0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
58c0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
58d0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
58e0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
58f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
5900: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
5910: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
5920: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
5930: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
5940: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
5950: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
5960: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
5970: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
5980: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
5990: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
59a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
59b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
59c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
59d0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
59e0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
59f0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
5a00: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
5a10: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
5a20: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
5a30: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
5a40: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
5a50: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
5a60: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
5a70: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
5a80: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
5a90: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
5aa0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
5ab0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
5ac0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
5ad0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
5ae0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
5af0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
5b00: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
5b10: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
5b20: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
5b30: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
5b40: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b50: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5b60: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
5b70: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
5b80: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
5b90: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
5ba0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
5bb0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
5bc0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
5bd0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
5be0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
5bf0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
5c00: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
5c10: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
5c20: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
5c30: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
5c40: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
5c50: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
5c60: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
5c70: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
5c80: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
5c90: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
5ca0: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
5cb0: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
5cc0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
5cd0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
5ce0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
5cf0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
5d00: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
5d10: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
5d20: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
5d30: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
5d40: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
5d50: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
5d60: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
5d70: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
5d80: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
5d90: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
5da0: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
5db0: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
5dc0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
5dd0: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
5de0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
5df0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
5e00: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
5e10: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
5e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5e30: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
5e40: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
5e50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
5e60: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
5e70: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
5e80: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
5e90: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
5ea0: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
5eb0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
5ec0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
5ed0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
5ee0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
5ef0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
5f00: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
5f10: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
5f20: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
5f30: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
5f40: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
5f50: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
5f60: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
5f70: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
5f80: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
5f90: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
5fa0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
5fb0: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
5fc0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
5fd0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
5fe0: 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b  *pIter = &pCell[
5ff0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
6000: 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a  ize];.  u32 nSiz
6010: 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
6020: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
6030: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
6040: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
6050: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
6060: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
6070: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
6080: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
6090: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
60a0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
60b0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
60c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
60d0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
60e0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
60f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
6100: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
6110: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
6120: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
6130: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
6140: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
6150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
6160: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
6170: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
6180: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
6190: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
61a0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
61b0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
61c0: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
61d0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
61e0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
61f0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
6200: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
6210: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6220: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
6230: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
6240: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
6250: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
6260: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
6270: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
6280: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
6290: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
62a0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
62b0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
62c0: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
62d0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
62e0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
62f0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
6300: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
6310: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
6320: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
6330: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
6340: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
6350: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
6360: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
6370: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
6380: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
6390: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
63a0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
63b0: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
63c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
63d0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
63e0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
63f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
6400: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
6410: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
6420: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
6430: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
6440: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
6450: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
6460: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
6470: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
6480: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
6490: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
64a0: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
64b0: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
64c0: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
64d0: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
64e0: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
64f0: 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  UG.static u16 ce
6500: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
6510: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
6520: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
6530: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
6540: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6550: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
6560: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6570: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
6580: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
6590: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
65a0: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
65b0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
65c0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
65d0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
65e0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
65f0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
6600: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
6610: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
6620: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
6630: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
6640: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
6650: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
6660: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  o;.  assert( pCe
6670: 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ll!=0 );.  sqlit
6680: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
6690: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
66a0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
66b0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
66c0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
66d0: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
66e0: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
66f0: 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61   if( (info.nData
6700: 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
6710: 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e  0:info.nKey))>in
6720: 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
6730: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
6740: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
6750: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
6760: 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
6770: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
6780: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
6790: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
67a0: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
67b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
67c0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
67d0: 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65  l with index iCe
67e0: 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
67f0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
6800: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
6810: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
6820: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
6830: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
6840: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
6850: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
6860: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
6870: 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a  utOvfl(MemPage *
6880: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
6890: 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  ){.  u8 *pCell;.
68a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
68b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
68c0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
68d0: 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  );.  pCell = fin
68e0: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
68f0: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72  age, iCell);.  r
6900: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f  eturn ptrmapPutO
6910: 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
6920: 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ell);.}.#endif..
6930: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
6940: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
6950: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
6960: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
6970: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
6980: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
6990: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
69a0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
69b0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
69c0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
69d0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
69e0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
69f0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
6a00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
6a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
6a20: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
6a30: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
6a40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
6a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
6a60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
6a70: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6a90: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
6aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64  cell */.  int ad
6ab0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
6ac0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6ad0: 66 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  f first byte aft
6ae0: 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  er cell pointer 
6af0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68  array */.  int h
6b00: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
6b10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6b20: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
6b30: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
6b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6b50: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
6b60: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
6b70: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
6b80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6b90: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
6ba0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
6bb0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
6bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
6bd0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
6be0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
6bf0: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c10: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
6c20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
6c30: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
6c60: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
6c70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6c80: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
6c90: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
6ca0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
6cb0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
6cc0: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
6cd0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
6ce0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6cf0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
6d00: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
6d10: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
6d20: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
6d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6d40: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
6d50: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
6d60: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
6d70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
6d80: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
6d90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6da0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
6db0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
6dc0: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
6dd0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
6de0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
6df0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
6e00: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
6e10: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
6e20: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
6e30: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
6e40: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
6e50: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
6e60: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
6e70: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
6e80: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
6e90: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
6ea0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
6eb0: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
6ec0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
6ed0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
6ee0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
6ef0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
6f00: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
6f10: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
6f20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
6f30: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
6f40: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
6f50: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
6f60: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
6f70: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
6f80: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
6f90: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
6fa0: 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20  pAddr);.    if( 
6fb0: 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  pc>=usableSize )
6fc0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
6fd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6fe0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69  PT;.    }.    si
6ff0: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
7000: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
7010: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
7020: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
7030: 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  rk<cellOffset+2*
7040: 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65  nCell || pc+size
7050: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
7060: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7070: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7080: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
7090: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
70a0: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
70b0: 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  >=0 );.    memcp
70c0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
70d0: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
70e0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
70f0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
7100: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
7110: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
7120: 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ll );.  put2byte
7130: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
7140: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
7150: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
7160: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
7170: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
7180: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
7190: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
71a0: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
71b0: 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b  , 0, cbrk-addr);
71c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
71d0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
71e0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
71f0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
7200: 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46  -addr!=pPage->nF
7210: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
7220: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7230: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
7240: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7250: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
7260: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
7270: 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69  space from withi
7280: 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67  n the B-Tree pag
7290: 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74  e passed.** as t
72a0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
72b0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  t. Return the in
72c0: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
72d0: 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 0a  aData[] of the .
72e0: 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  ** first byte of
72f0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
7300: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  . .**.** The cal
7310: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
7320: 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65  hat the space be
7330: 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
7340: 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74   the cell-offset
7350: 20 0a 2a 2a 20 61 72 72 61 79 20 61 6e 64 20 74   .** array and t
7360: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
7370: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
7380: 61 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e 42  a is at least nB
7390: 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20  yte bytes.** in 
73a0: 73 69 7a 65 2e 20 53 6f 20 74 68 69 73 20 72 6f  size. So this ro
73b0: 75 74 69 6e 65 20 63 61 6e 20 6e 65 76 65 72 20  utine can never 
73c0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  fail..**.** If t
73d0: 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
73e0: 20 36 30 20 6f 72 20 6d 6f 72 65 20 62 79 74 65   60 or more byte
73f0: 73 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 77  s of fragments w
7400: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 0a  ithin the page,.
7410: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 64  ** the page is d
7420: 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f  efragmented befo
7430: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 66  re returning. If
7440: 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 64   this were not d
7450: 6f 6e 65 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  one there.** is 
7460: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
7470: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67  e number of frag
7480: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 63 6f 75  mented bytes cou
7490: 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a  ld eventually .*
74a0: 2a 20 6f 76 65 72 66 6c 6f 77 20 74 68 65 20 73  * overflow the s
74b0: 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 65 6c 64  ingle-byte field
74c0: 20 6f 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   of the page-hea
74d0: 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 69  der in which thi
74e0: 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 74  s value.** is st
74f0: 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ored..*/.static 
7500: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
7510: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7520: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
7530: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
7540: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7550: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
7560: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
7570: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
7580: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
7590: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
75a0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
75b0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
75c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b   */.  int nFrag;
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
75f0: 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74  mber of fragment
7600: 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67  ed bytes on pPag
7610: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 0a  e */.  int top;.
7620: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
7630: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7640: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
7650: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7660: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
7670: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7680: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7690: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
76a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
76b0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
76c0: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
76d0: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
76e0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
76f0: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
7700: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
7710: 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  ow==0 );..  /* A
7720: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 73  ssert that the s
7730: 70 61 63 65 20 62 65 74 77 65 65 6e 20 74 68 65  pace between the
7740: 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72 72   cell-offset arr
7750: 61 79 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a  ay and the .  **
7760: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
7770: 65 61 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ea is greater th
7780: 61 6e 20 6e 42 79 74 65 20 62 79 74 65 73 2e 0a  an nByte bytes..
7790: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e    */.  assert( n
77a0: 42 79 74 65 20 3c 3d 20 28 0a 20 20 20 20 20 20  Byte <= (.      
77b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
77c0: 64 72 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28 70  dr+5])-(hdr+8+(p
77d0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 2b  Page->leaf?0:4)+
77e0: 32 2a 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2*get2byte(&data
77f0: 5b 68 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b 0a  [hdr+3])).  ));.
7800: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
7810: 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b 0a 20  -= (u16)nByte;. 
7820: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
7830: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
7840: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 64 65 66  g>=60 ){.    def
7850: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
7860: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
7870: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
7880: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
7890: 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20  for a free slot 
78a0: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
78b0: 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68  tisfy .    ** th
78c0: 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61  e request. The a
78d0: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64  llocation is mad
78e0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  e from the first
78f0: 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20   free slot in . 
7900: 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74     ** the list t
7910: 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  hat is large eno
7920: 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74  ugh to accomadat
7930: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
7940: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
7950: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
7960: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
7970: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
7980: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
7990: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65     int size = ge
79a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
79b0: 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  2]);     /* Size
79c0: 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f   of free slot */
79d0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
79e0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
79f0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
7a00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
7a10: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
7a20: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
7a30: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
7a40: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
7a50: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
7a60: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
7a70: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
7a80: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
7a90: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
7aa0: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
7ab0: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
7ac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
7ad0: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
7ae0: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
7af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7b00: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
7b10: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
7b20: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
7b30: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
7b40: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
7b50: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
7b60: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
7b70: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
7b80: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
7b90: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
7ba0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7bb0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b       return pc +
7bc0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
7bd0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
7be0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
7bf0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
7c00: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
7c10: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
7c20: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
7c30: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
7c40: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
7c50: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2d  (&data[hdr+5]) -
7c60: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
7c70: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
7c80: 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20   top);.  return 
7c90: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
7ca0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
7cb0: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
7cc0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
7cd0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
7ce0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
7cf0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
7d00: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
7d10: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
7d20: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
7d30: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
7d40: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
7d50: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
7d60: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
7d70: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
7d80: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
7d90: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
7da0: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
7db0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
7dc0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
7dd0: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
7de0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
7df0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
7e00: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
7e10: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
7e20: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
7e30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
7e40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7e50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
7e60: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
7e70: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
7e80: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
7e90: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
7ea0: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
7eb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
7ec0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
7ed0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7ee0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
7ef0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7f00: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7f10: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7f20: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
7f30: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
7f40: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
7f50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
7f60: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
7f70: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
7f80: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
7f90: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
7fa0: 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54  the SECURE_DELET
7fb0: 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  E .  ** option i
7fc0: 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
7fd0: 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d  pile-time */.  m
7fe0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
7ff0: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65  t], 0, size);.#e
8000: 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
8010: 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e  he space back in
8020: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
8030: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
8040: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
8050: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
8060: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
8070: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
8080: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8090: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
80a0: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
80b0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
80c0: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
80d0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
80e0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61     if( pbegin<=a
80f0: 64 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65  ddr ) {.      re
8100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8110: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8120: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
8130: 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62  n;.  }.  if ( pb
8140: 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d  egin>pPage->pBt-
8150: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20  >usableSize-4 ) 
8160: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8170: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8180: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
8190: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
81a0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
81b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
81c0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
81d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
81e0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
81f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
8200: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
8210: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
8220: 3d 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20  = (u16)size;..  
8230: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
8240: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
8250: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
8260: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
8270: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
8280: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
8290: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
82a0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
82b0: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
82c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
82d0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
82e0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
82f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8300: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
8310: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8320: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
8330: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
8340: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
8350: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
8360: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
8370: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
8380: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
8390: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
83a0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
83b0: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
83c0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
83d0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
83e0: 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20  set+7]) ){.     
83f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8400: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74       }.      dat
8420: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
8430: 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61  et+7] -= (u8)fra
8440: 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  g;.      x = get
8450: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
8460: 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  t]);.      put2b
8470: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
8480: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d  ], x);.      x =
8490: 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74   pnext + get2byt
84a0: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
84b0: 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  ) - pbegin;.    
84c0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
84d0: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a  [pbegin+2], x);.
84e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84f0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
8500: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8510: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
8520: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
8530: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
8540: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
8550: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
8560: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
8570: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
8580: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
8590: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
85a0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
85b0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
85c0: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
85d0: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
85e0: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
85f0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
8600: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67  data[hdr+5]) + g
8610: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
8620: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75  egin+2]);.    pu
8630: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8640: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20  +5], top);.  }. 
8650: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8660: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
8670: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8680: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
8690: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
86a0: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
86b0: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
86c0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
86d0: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
86e0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
86f0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
8700: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
8710: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
8720: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
8730: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
8740: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
8750: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
8760: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
8770: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
8780: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
8790: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
87a0: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
87b0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
87c0: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
87d0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
87e0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
87f0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
8800: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
8810: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
8820: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
8830: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
8840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
8850: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
8860: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
8870: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
8880: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
8890: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
88a0: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
88b0: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
88c0: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
88d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
88e0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
88f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
8900: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
8910: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
8920: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
8930: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
8940: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
8950: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
8960: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
8970: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42  Page->leaf;.  pB
8980: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
8990: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
89a0: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
89b0: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
89c0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
89d0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
89e0: 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65  >hasData = pPage
89f0: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
8a00: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
8a10: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
8a20: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
8a30: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
8a40: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
8a50: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
8a60: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
8a70: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
8a80: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
8a90: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
8aa0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
8ab0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
8ac0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
8ad0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
8ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
8af0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8b00: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
8b10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
8b30: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
8b40: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
8b50: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
8b60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
8b70: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
8b80: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
8b90: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
8ba0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
8bb0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
8bc0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
8bd0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
8be0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
8bf0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
8c00: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
8c10: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
8c20: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
8c30: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
8c40: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
8c50: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
8c60: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
8c70: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
8c80: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
8c90: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
8ca0: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
8cb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
8cc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8cd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8ce0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
8cf0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
8d00: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
8d10: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
8d20: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
8d30: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
8d40: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
8d50: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8d60: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8d70: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8d80: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
8d90: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
8da0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
8db0: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
8dc0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
8dd0: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
8de0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
8df0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
8e00: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
8e10: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
8e20: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
8e30: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
8e40: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
8e50: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
8e60: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
8e70: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
8e80: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
8e90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
8ea0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
8eb0: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
8ec0: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61  e */.    u16 usa
8ed0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
8ee0: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
8ef0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
8f00: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
8f10: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
8f20: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
8f30: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
8f40: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
8f50: 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65  */.    u16 nFree
8f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
8f70: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8f80: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
8f90: 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20  */.    u16 top; 
8fa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
8fb0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
8fc0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
8fd0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
8fe0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
8ff0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9000: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
9010: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9020: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
9030: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
9040: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
9050: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9060: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
9070: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
9080: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
9090: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
90a0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
90b0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
90c0: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
90d0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
90e0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
90f0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
9100: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
9110: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
9120: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
9130: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
9140: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
9150: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9160: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
9170: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
9180: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
9190: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
91a0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
91b0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
91c0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
91d0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
91e0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
91f0: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
9200: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9210: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9220: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61    }..    /* A ma
9230: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
9240: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
9250: 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70 61  e use to read pa
9260: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
9270: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
9280: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
9290: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
92a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
92b0: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
92c0: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
92d0: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
92e0: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
92f0: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
9300: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
9310: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
9320: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
9330: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
9340: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  oes..    */.#if 
9350: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9360: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9370: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b  ELL_CHECK).    {
9380: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  .      int iCell
9390: 46 69 72 73 74 3b 20 20 20 2f 2a 20 46 69 72 73  First;   /* Firs
93a0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
93b0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
93c0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
93d0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
93e0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
93f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
9400: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9410: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
9420: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
9430: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
9440: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9450: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
9460: 20 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20       iCellFirst 
9470: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
9480: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
9490: 20 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d       iCellLast =
94a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
94b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
94c0: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
94d0: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
94e0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
94f0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
9500: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
9510: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
9520: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
9530: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
9540: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
9550: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
9560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9570: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9590: 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
95a0: 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
95b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
95c0: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
95d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
95e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
95f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
9600: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9610: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
9620: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9630: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
9640: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
9650: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
9660: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
9670: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
9680: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
9690: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
96a0: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
96b0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
96c0: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
96d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
96e0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66  ree block is off
96f0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
9700: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9710: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9720: 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
9730: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
9740: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
9750: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
9760: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
9770: 20 20 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30        if( next>0
9780: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
9790: 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  e+3 ){.        /
97a0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
97b0: 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69  st be in accendi
97c0: 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ng order */.    
97d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
97e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
97f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
9800: 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 20 20  Free += size;.  
9810: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
9820: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
9830: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
9840: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
9850: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
9860: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
9870: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
9880: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
9890: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
98a0: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
98b0: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
98c0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
98d0: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
98e0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
98f0: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
9900: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
9910: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
9920: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
9930: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
9940: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
9950: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
9960: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
9970: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
9980: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
9990: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
99a0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
99b0: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
99c0: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
99d0: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
99e0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
99f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9a00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
9a10: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
9a20: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d 20 28  Free = nFree - (
9a30: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
9a40: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 23  Page->nCell);..#
9a50: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
9a60: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
9a70: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
9a80: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
9a90: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
9aa0: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
9ab0: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
9ac0: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
9ad0: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
9ae0: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
9af0: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
9b00: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
9b10: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
9b20: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
9b30: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
9b40: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
9b50: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
9b60: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
9b70: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
9b80: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
9b90: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
9ba0: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
9bb0: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
9bc0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
9bd0: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
9be0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
9bf0: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
9c00: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
9c10: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
9c20: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
9c30: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
9c40: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
9c50: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
9c60: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
9c70: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9c80: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
9c90: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
9ca0: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
9cb0: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
9cc0: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
9cd0: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
9ce0: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
9cf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9d00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9d10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
9d20: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
9d30: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
9d40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9d50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
9d60: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
9d70: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
9d80: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
9d90: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
9da0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
9db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
9dc0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
9dd0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
9de0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
9df0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
9e00: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
9e10: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
9e20: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
9e30: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9e40: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
9e50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9e60: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
9e70: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
9e80: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
9e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9ea0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
9eb0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9ec0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
9ed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9ee0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
9ef0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
9f00: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
9f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9f20: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
9f30: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9f50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9f60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9f70: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
9f80: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
9f90: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
9fa0: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
9fb0: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
9fc0: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
9fd0: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
9fe0: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
9ff0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
a000: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
a010: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a020: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a030: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
a040: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
a050: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
a060: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
a070: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
a080: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
a090: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
a0a0: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
a0b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
a0c0: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
a0d0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
a0e0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
a0f0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
a100: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
a110: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
a120: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
a130: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
a140: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
a150: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
a160: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
a170: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
a180: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
a190: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
a1a0: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
a1b0: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
a1c0: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
a1d0: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
a1e0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
a1f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
a200: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
a210: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
a220: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
a230: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
a240: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
a250: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
a260: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
a270: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
a280: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
a290: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
a2a0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
a2b0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
a2c0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
a2d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
a2e0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
a2f0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
a300: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
a310: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
a320: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
a330: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
a340: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
a350: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
a360: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
a370: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
a380: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
a390: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
a3a0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
a3b0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
a3c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
a3d0: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
a3e0: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
a3f0: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
a400: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
a410: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
a420: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
a430: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
a440: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
a450: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
a460: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
a470: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
a480: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
a490: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
a4a0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
a4b0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
a4c0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
a4d0: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
a4e0: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
a4f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
a500: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
a510: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
a520: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
a530: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
a540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a550: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
a560: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
a570: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
a580: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a590: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
a5a0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
a5b0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
a5c0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
a5d0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
a5e0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
a5f0: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
a600: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
a610: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a620: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
a630: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
a640: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
a650: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
a660: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
a670: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
a680: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
a690: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
a6a0: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
a6b0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
a6c0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
a6d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a6e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
a6f0: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
a700: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
a710: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
a720: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
a730: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
a740: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
a750: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
a760: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
a770: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
a780: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
a790: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
a7a0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
a7b0: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
a7c0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
a7d0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
a7e0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
a7f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
a810: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
a820: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
a830: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
a840: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
a850: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
a860: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
a870: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
a880: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
a890: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a8a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
a8b0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
a8c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a8d0: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
a8e0: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
a8f0: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
a900: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
a910: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
a920: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
a930: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
a940: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
a950: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
a960: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
a970: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
a980: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
a990: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
a9a0: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
a9b0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
a9c0: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
a9d0: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
a9e0: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
a9f0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
aa00: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
aa10: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
aa20: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
aa30: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
aa40: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
aa50: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
aa60: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
aa70: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
aa80: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
aa90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
aaa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
aab0: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
aac0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
aad0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
aae0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
aaf0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ab00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ab10: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
ab20: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
ab30: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
ab40: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
ab50: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
ab60: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
ab70: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
ab80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ab90: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
aba0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
abb0: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
abc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
abd0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
abe0: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74  ..  /* It is oft
abf0: 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61 74  en the case that
ac00: 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61 6e   the page we wan
ac10: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
ac20: 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73  cache..  ** If s
ac30: 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63 74  o, get it direct
ac40: 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73 20  ly.  This saves 
ac50: 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
ac60: 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65  o call.  ** page
ac70: 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20  rPagecount() to 
ac80: 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69  make sure pgno i
ac90: 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c  s within limits,
aca0: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20   which results. 
acb0: 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65   ** in a measure
acc0: 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
acd0: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20   improvements.. 
ace0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   */.  *ppPage = 
acf0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
ad00: 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e  eLookup(pBt, pgn
ad10: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20  o);.  if( pPage 
ad20: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69  ){.    /* Page i
ad30: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
ad40: 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  he */.    rc = S
ad50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
ad60: 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  e{.    /* Page n
ad70: 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41 63  ot in cache.  Ac
ad80: 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  quire it. */.   
ad90: 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
ada0: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
adb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
adc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
add0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  T; .    }.    rc
ade0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
adf0: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
ae00: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
ae10: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
ae20: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20  n rc;.    pPage 
ae30: 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20  = *ppPage;.  }. 
ae40: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
ae50: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
ae60: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
ae70: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
ae80: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ae90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
aea0: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
aeb0: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
aec0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
aed0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
aee0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
aef0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
af00: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
af10: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
af20: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
af30: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
af40: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
af50: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
af60: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
af70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
af80: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
af90: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
afa0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
afb0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3e  pPage->pDbPage)>
afc0: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
afd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
afe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
aff0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
b000: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
b010: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
b020: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
b030: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
b040: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
b050: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
b060: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
b070: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
b080: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b090: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b0a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b0b0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
b0c0: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
b0d0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
b0e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
b0f0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
b100: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
b110: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
b120: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
b130: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
b140: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
b150: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
b160: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
b170: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
b180: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
b190: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
b1a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b1b0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
b1c0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
b1d0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
b1e0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
b1f0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b200: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
b210: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
b220: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
b230: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
b240: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
b250: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
b260: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
b270: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
b280: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
b290: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
b2a0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b2b0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
b2c0: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
b2d0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
b2e0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b2f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b300: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b310: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
b320: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
b330: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
b340: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
b350: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
b360: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
b370: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
b380: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
b390: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b3a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
b3b0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
b3c0: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
b3d0: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
b3e0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
b3f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b400: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
b410: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
b420: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b430: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
b440: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
b450: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
b460: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
b470: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
b480: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
b490: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
b4a0: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
b4b0: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
b4c0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
b4d0: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
b4e0: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
b4f0: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
b500: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
b510: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
b520: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
b530: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
b540: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
b550: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
b560: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
b570: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
b580: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
b590: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b5a0: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
b5b0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
b5c0: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
b5d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b5e0: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
b5f0: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
b600: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
b610: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
b620: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
b630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
b640: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
b650: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
b660: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
b670: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b680: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
b690: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e  e is NULL.** a n
b6a0: 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ew database with
b6b0: 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69   a random name i
b6c0: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73  s created.  This
b6d0: 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a   randomly named.
b6e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
b6f0: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
b700: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
b710: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
b720: 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  led..** If zFile
b730: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
b740: 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
b750: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
b760: 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
b770: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
b780: 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
b790: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
b7a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
b7b0: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
b7c0: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
b7d0: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
b7e0: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
b7f0: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
b800: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
b810: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
b820: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
b830: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
b840: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
b850: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
b860: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
b870: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
b880: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
b890: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
b8a0: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
b8b0: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
b8c0: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
b8d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
b8e0: 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  eOpen(.  const c
b8f0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
b900: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
b910: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
b920: 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
b930: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
b940: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
b950: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
b960: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
b970: 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
b980: 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
b990: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
b9a0: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
b9b0: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
b9c0: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
b9d0: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
b9e0: 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ba00: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
ba10: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
ba20: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
ba30: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
ba40: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  pVfs;           
ba50: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20    /* The VFS to 
ba60: 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72  use for this btr
ba70: 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ee */.  BtShared
ba80: 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
ba90: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
baa0: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
bab0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
bac0: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bae0: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
baf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
bb00: 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
bb10: 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
bb20: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
bb30: 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
bb40: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
bb50: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
bb60: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bb70: 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
bb80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
bb90: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
bba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
bbb0: 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
bbc0: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
bbd0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
bbe0: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
bbf0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
bc00: 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
bc10: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
bc20: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
bc30: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
bc40: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
bc50: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
bc60: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
bc70: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
bc80: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
bc90: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
bca0: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
bcb0: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
bcc0: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
bcd0: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
bce0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
bcf0: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
bd00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
bd10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
bd20: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
bd30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
bd40: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
bd50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
bd60: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
bd70: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
bd80: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
bd90: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
bda0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
bdb0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
bdc0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
bdd0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
bde0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
bdf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
be00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
be10: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
be20: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
be30: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
be40: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
be50: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
be60: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
be70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
be80: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
be90: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
bea0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20  ->db = db;..#if 
beb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
bec0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
bed0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
bee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
bef0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
bf00: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
bf10: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
bf20: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
bf30: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
bf40: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
bf50: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
bf60: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
bf70: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
bf80: 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61  db==0 && zFilena
bf90: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
bfa0: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  0] ){.    if( sq
bfb0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
bfc0: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
bfd0: 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  bled ){.      in
bfe0: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
bff0: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
c000: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
c010: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
c020: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
c030: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
c040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
c050: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
c060: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
c070: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ble = 1;.      d
c080: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
c090: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
c0a0: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
c0b0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
c0c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c0d0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
c0e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c0f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c100: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
c110: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
c120: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
c130: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
c140: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
c150: 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
c160: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
c170: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
c180: 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
c190: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
c1a0: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
c1b0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
c1c0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
c1d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
c1e0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
c1f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c200: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
c210: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
c220: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
c230: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
c240: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
c250: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
c260: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
c270: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
c280: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
c290: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
c2a0: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
c2b0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
c2c0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
c2e0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
c2f0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
c300: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
c310: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
c320: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
c330: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
c340: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
c350: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
c360: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
c370: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
c380: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
c390: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
c3a0: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
c3b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c3c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
c3d0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
c3e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c3f0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
c400: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
c410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
c420: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
c430: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
c440: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
c460: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c470: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
c480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c490: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
c4a0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
c4b0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
c4c0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
c4d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
c4e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c4f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
c500: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
c510: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c520: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
c530: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
c540: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
c550: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
c560: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
c570: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
c580: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
c590: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
c5a0: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
c5b0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
c5c0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
c5d0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
c5e0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
c5f0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
c600: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
c610: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
c620: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
c630: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
c640: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
c650: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
c660: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
c670: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
c680: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
c690: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
c6a0: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
c6b0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
c6c0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
c6d0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
c6e0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
c6f0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
c700: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
c710: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
c720: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
c730: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
c740: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
c750: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
c760: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
c770: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c780: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
c790: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
c7a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c7b0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
c7c0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
c7d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
c7e0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
c7f0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
c800: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
c810: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
c820: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
c830: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
c840: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
c850: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
c860: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
c870: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
c880: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
c890: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
c8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
c8b0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
c8c0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
c8d0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8f0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
c900: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
c910: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
c920: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c930: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
c940: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
c950: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
c960: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
c970: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
c980: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
c990: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c9a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
c9b0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
c9c0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
c9d0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
c9e0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
c9f0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
ca00: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ca10: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
ca20: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
ca30: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
ca40: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
ca50: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
ca60: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
ca70: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
ca80: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
ca90: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
caa0: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
cab0: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
cac0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
cad0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
cae0: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
caf0: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
cb00: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
cb10: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
cb20: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
cb30: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
cb40: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
cb50: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
cb60: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
cb70: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
cb80: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
cb90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
cba0: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
cbb0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
cbc0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
cbd0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
cbe0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
cbf0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
cc00: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
cc10: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
cc20: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
cc30: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
cc40: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
cc50: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
cc60: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
cc70: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
cc80: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
cc90: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
cca0: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
ccb0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
ccc0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
ccd0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
cce0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
ccf0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
cd00: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
cd10: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
cd20: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
cd30: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
cd40: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
cd50: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
cd60: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
cd70: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
cd80: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
cd90: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
cda0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
cdb0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
cdc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
cdd0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
cde0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
cdf0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
ce00: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
ce10: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
ce20: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
ce30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ce40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ce50: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
ce60: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
ce70: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
ce80: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
ce90: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
cea0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
ceb0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
cec0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
ced0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
cee0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
cef0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
cf00: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
cf10: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ize);.    if( rc
cf20: 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70   ) goto btree_op
cf30: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d  en_out;.    pBt-
cf40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
cf50: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
cf60: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
cf70: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
cf80: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
cf90: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
cfa0: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
cfb0: 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  /.   .#if !defin
cfc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
cfd0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
cfe0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
cff0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
d000: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
d010: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
d020: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
d030: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
d040: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
d050: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
d060: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
d070: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
d080: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
d090: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
d0a0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
d0b0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
d0c0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
d0d0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
d0e0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
d0f0: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
d100: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
d110: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
d120: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
d130: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
d140: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
d150: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
d160: 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
d170: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
d180: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
d190: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  MEM;.          d
d1a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d1b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
d1c0: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
d1d0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
d1e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d1f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
d200: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
d210: 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
d220: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d230: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d240: 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
d250: 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
d260: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d270: 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
d280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
d290: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
d2a0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
d2b0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
d2c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d2d0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
d2e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
d2f0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
d300: 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
d310: 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
d320: 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
d330: 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
d340: 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
d350: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
d360: 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
d370: 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
d380: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
d390: 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
d3a0: 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
d3b0: 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
d3c0: 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
d3d0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
d3e0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d3f0: 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
d400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
d410: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
d420: 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
d430: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
d440: 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
d450: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
d460: 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
d470: 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
d480: 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
d490: 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
d4a0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
d4b0: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
d4c0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
d4d0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
d4e0: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
d4f0: 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
d500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d510: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
d520: 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
d530: 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
d540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
d550: 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
d560: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d570: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
d580: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
d590: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
d5a0: 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
d5b0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
d5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d5d0: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
d5e0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
d5f0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
d600: 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
d610: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
d620: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d630: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
d640: 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
d650: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
d660: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d670: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
d680: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
d690: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d6a0: 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
d6b0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
d6c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d6d0: 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
d6e0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
d6f0: 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
d700: 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
d710: 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
d720: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d730: 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
d740: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
d750: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
d760: 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
d770: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d780: 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
d790: 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
d7a0: 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
d7b0: 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
d7c0: 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
d7d0: 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
d7e0: 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
d7f0: 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
d800: 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
d810: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
d820: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
d830: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
d840: 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
d850: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
d860: 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
d870: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
d880: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
d890: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d8a0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
d8b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
d8c0: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68  *pMaster;.  BtSh
d8d0: 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
d8e0: 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
d8f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d900: 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
d910: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d920: 20 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    pMaster = sqli
d930: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
d940: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
d950: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c  C_MASTER);.  sql
d960: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d970: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
d980: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
d990: 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
d9a0: 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
d9b0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
d9c0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
d9d0: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
d9e0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
d9f0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
da00: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
da10: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
da20: 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
da30: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
da40: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
da50: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
da60: 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
da70: 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
da80: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
da90: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
daa0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
dab0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
dac0: 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
dad0: 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
dae0: 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
daf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
db00: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
db10: 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
db20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
db30: 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
db40: 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
db50: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
db60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
db70: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
db80: 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
db90: 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
dba0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
dbb0: 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
dbc0: 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
dbd0: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
dbe0: 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
dbf0: 5a 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a  ZE(pBt) bytes..*
dc00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
dc10: 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
dc20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
dc30: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
dc40: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
dc50: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
dc60: 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
dc70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
dc80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
dc90: 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
dca0: 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
dcb0: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
dcc0: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
dcd0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
dce0: 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
dcf0: 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
dd00: 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  );.  pBt->pTmpSp
dd10: 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ace = 0;.}../*.*
dd20: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
dd30: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
dd40: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
dd50: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
dd60: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
dd70: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
dd80: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
dd90: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
dda0: 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  Cur;..  /* Close
ddb0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
ddc0: 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e  ned via this han
ddd0: 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  dle.  */.  asser
dde0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ddf0: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
de00: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
de10: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
de20: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
de30: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
de40: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
de50: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
de60: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
de70: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
de80: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
de90: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
dea0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
deb0: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
dec0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
ded0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
dee0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
def0: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
df00: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
df10: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
df20: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
df30: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
df40: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
df50: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
df60: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
df70: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
df80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
df90: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
dfa0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
dfb0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
dfc0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
dfd0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
dfe0: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
dff0: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
e000: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
e010: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
e020: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
e030: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
e040: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e050: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
e060: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
e070: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
e080: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
e090: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
e0a0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
e0b0: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
e0c0: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
e0d0: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
e0e0: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
e0f0: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
e100: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
e110: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
e120: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
e130: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
e140: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
e150: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
e160: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
e170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
e180: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
e190: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
e1a0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
e1b0: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
e1c0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
e1d0: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
e1e0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
e1f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e200: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
e210: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
e220: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
e230: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
e240: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e250: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
e260: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
e270: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
e280: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
e290: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
e2a0: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
e2b0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
e2c0: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
e2d0: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
e2e0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
e2f0: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
e300: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e310: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e320: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
e330: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
e340: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
e350: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
e360: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
e370: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
e380: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
e390: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
e3a0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
e3b0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
e3c0: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
e3d0: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
e3e0: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
e3f0: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
e400: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
e410: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
e420: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
e430: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
e440: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
e450: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
e460: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
e470: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
e480: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
e490: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
e4a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
e4b0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
e4c0: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
e4d0: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
e4e0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
e4f0: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
e500: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
e510: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
e520: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
e530: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
e540: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
e550: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
e560: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
e570: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
e580: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
e590: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
e5a0: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
e5b0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e5c0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
e5d0: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
e5e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
e5f0: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
e600: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
e610: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
e620: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
e630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e640: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
e650: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
e660: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e670: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
e680: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
e690: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
e6a0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
e6b0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e6c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
e6e0: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
e6f0: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
e700: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
e710: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
e720: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
e730: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
e740: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
e750: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
e760: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
e770: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
e780: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
e790: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
e7a0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
e7b0: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
e7c0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
e7d0: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
e7e0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
e7f0: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
e800: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
e810: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
e820: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
e830: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
e840: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
e850: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
e860: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
e870: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
e880: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
e890: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e8a0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
e8b0: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
e8c0: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
e8d0: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
e8e0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
e8f0: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
e900: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e910: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e920: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e930: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
e940: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e950: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
e960: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
e970: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
e980: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
e990: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
e9a0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
e9b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e9c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
e9d0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
e9e0: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
e9f0: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
ea00: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
ea10: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
ea20: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
ea30: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
ea40: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
ea50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ea60: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
ea70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
ea80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
ea90: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
eaa0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
eab0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
eac0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
ead0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
eae0: 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
eaf0: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
eb00: 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
eb10: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
eb20: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
eb30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
eb40: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
eb50: 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
eb60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
eb70: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
eb80: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
eb90: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
eba0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
ebb0: 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
ebc0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
ebd0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
ebe0: 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
ebf0: 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
ec00: 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
ec10: 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
ec20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
ec30: 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
ec40: 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
ec50: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
ec60: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
ec70: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
ec80: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
ec90: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
eca0: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
ecb0: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
ecc0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
ecd0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
ece0: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
ecf0: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
ed00: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
ed10: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
ed20: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
ed30: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
ed40: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
ed50: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
ed60: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
ed70: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
ed80: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
ed90: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
eda0: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
edb0: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
edc0: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
edd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
ede0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
edf0: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
ee00: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
ee10: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
ee20: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
ee30: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
ee40: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
ee50: 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
ee60: 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
ee70: 20 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78   the pageSizeFix
ee80: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ed flag is set s
ee90: 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
eea0: 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
eeb0: 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
eec0: 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
eed0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
eee0: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
eef0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
ef00: 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
ef10: 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
ef20: 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
ef30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
ef40: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
ef50: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
ef60: 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
ef70: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
ef80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
ef90: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
efa0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
efb0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
efc0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
efd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
efe0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
eff0: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
f000: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
f010: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
f020: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
f030: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
f040: 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
f050: 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
f060: 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
f070: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
f080: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
f090: 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
f0a0: 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
f0b0: 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
f0c0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
f0d0: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
f0e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
f0f0: 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
f100: 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
f110: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f120: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
f130: 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
f140: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20  ce(pBt);.    rc 
f150: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
f160: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
f170: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
f180: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42  eSize);.  }.  pB
f190: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
f1a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
f1b0: 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
f1c0: 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
f1d0: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
f1e0: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   1;.  sqlite3Btr
f1f0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f200: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f210: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
f220: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
f230: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
f240: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
f250: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
f260: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
f270: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
f280: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f290: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
f2a0: 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
f2b0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
f2c0: 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
f2d0: 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
f2e0: 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
f2f0: 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
f300: 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
f310: 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
f320: 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
f330: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
f340: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
f350: 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
f360: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
f370: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
f380: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
f390: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
f3a0: 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
f3b0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
f3c0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
f3d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
f3e0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
f3f0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
f400: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
f410: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
f420: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
f430: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
f440: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
f450: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
f460: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
f470: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
f480: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
f490: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f4a0: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
f4b0: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
f4c0: 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
f4d0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
f4e0: 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
f4f0: 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
f500: 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
f510: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
f520: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
f530: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
f540: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
f550: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f560: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
f570: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
f580: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
f590: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
f5a0: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
f5b0: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
f5c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
f5d0: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
f5e0: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
f5f0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f600: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
f610: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
f620: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
f630: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
f640: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
f650: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
f660: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
f670: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
f680: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
f690: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
f6a0: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
f6b0: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
f6c0: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
f6d0: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
f6e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f6f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
f700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
f710: 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
f720: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
f730: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
f740: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
f750: 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
f760: 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
f770: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
f780: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
f790: 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
f7a0: 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
f7b0: 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
f7c0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
f7d0: 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
f7e0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f7f0: 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
f800: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f810: 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
f820: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
f830: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
f840: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
f850: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f860: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
f870: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
f880: 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
f890: 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
f8a0: 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
f8b0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
f8c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
f8d0: 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
f8e0: 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
f8f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f900: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
f910: 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
f920: 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
f930: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
f940: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
f950: 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
f960: 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
f970: 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
f980: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
f990: 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
f9a0: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
f9b0: 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
f9c0: 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
f9d0: 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
f9e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
f9f0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
fa00: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
fa10: 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
fa20: 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
fa30: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fa40: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
fa50: 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
fa60: 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
fa70: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
fa80: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
fa90: 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
faa0: 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
fab0: 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
fac0: 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
fad0: 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
fae0: 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
faf0: 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
fb00: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
fb10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
fb20: 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
fb30: 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
fb40: 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
fb50: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
fb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
fb70: 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
fb80: 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
fb90: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
fba0: 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67  age1;.  int nPag
fbb0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
fbc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fbd0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
fbe0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
fbf0: 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
fc00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
fc10: 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
fc20: 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
fc30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fc40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
fc50: 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
fc60: 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
fc70: 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
fc80: 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
fc90: 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
fca0: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
fcb0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
fcc0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
fcd0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
fce0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
fcf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fd00: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
fd10: 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20  failed;.  }else 
fd20: 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
fd30: 20 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b     int pageSize;
fd40: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
fd50: 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
fd60: 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
fd70: 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
fd80: 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
fd90: 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
fda0: 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
fdb0: 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
fdc0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
fdd0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
fde0: 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
fdf0: 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
fe00: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
fe10: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
fe20: 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[19]>1 ){.     
fe30: 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
fe40: 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
fe50: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
fe60: 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  um embedded frac
fe70: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61  tion must be exa
fe80: 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74  ctly 25%.  And t
fe90: 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  he minimum.    *
fea0: 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  * embedded fract
feb0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35  ion must be 12.5
fec0: 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d  % for both leaf-
fed0: 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61  data and non-lea
fee0: 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54  f-data..    ** T
fef0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
ff00: 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
ff10: 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
ff20: 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
ff30: 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
ff40: 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
ff50: 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
ff60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
ff70: 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
ff80: 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
ff90: 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
ffa0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
ffb0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
ffc0: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
ffd0: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
ffe0: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
fff0: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
10000 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
10010 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20  <512 ||.        
10020 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  (SQLITE_MAX_PAGE
10030 5f 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70  _SIZE<32768 && p
10040 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10050 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20  AX_PAGE_SIZE).  
10060 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
10070 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10080 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
10090 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
100a0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
100b0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
100c0 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
100d0 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a  .    if( pageSiz
100e0 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
100f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
10100 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
10110 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
10120 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
10130 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
10140 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
10150 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
10160 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
10170 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
10180 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
10190 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
101a0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
101b0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
101c0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
101d0 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
101e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
101f0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
10200 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
10210 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
10220 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
10230 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
10240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10250 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
10260 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
10270 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
10280 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
10290 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
102a0 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
102b0 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
102c0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
102d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
102e0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
102f0 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
10300 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10310 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
10320 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
10330 64 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  d;.      return 
10340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
10350 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
10360 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20  ize<500 ){.     
10370 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
10380 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
10390 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
103a0 20 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65   = (u16)pageSize
103b0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
103c0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
103d0 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
103e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
103f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
10400 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
10410 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
10420 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
10430 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
10440 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
10450 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
10460 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
10470 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
10480 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
10490 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
104a0 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
104b0 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
104c0 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
104d0 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
104e0 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
104f0 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
10500 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
10510 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
10520 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
10530 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
10540 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
10550 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
10560 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
10570 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
10580 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
10590 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
105a0 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
105b0 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
105c0 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
105d0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
105e0 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
105f0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
10600 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
10610 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
10620 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
10630 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61  2-byte poiner, a
10640 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
10650 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
10660 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
10670 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
10680 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
10690 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
106a0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
106b0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
106c0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
106d0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
106e0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
106f0 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
10700 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
10710 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
10720 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
10730 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75  maxLeaf = pBt->u
10740 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a  sableSize - 35;.
10750 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
10760 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
10770 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
10780 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  3;.  assert( pBt
10790 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
107a0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
107b0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
107c0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
107d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
107e0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
107f0 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
10800 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
10810 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
10820 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10840 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c  ine works like l
10850 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70  ockBtree() excep
10860 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69  t that it also i
10870 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75  nvokes the.** bu
10880 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
10890 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e  here is lock con
108a0 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  tention..*/.stat
108b0 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
108c0 57 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20  WithRetry(Btree 
108d0 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pRef){.  int rc
108e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
108f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10900 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
10910 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70  pRef) );.  if( p
10920 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  Ref->inTrans==TR
10930 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
10940 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  u8 inTransaction
10950 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e   = pRef->pBt->in
10960 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
10970 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
10980 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  pRef);.    rc = 
10990 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
109a0 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b  nTrans(pRef, 0);
109b0 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e  .    pRef->pBt->
109c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
109d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
109e0 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73     pRef->inTrans
109f0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
10a00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52  E_OK ){.      pR
10a20 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61  ef->pBt->nTransa
10a30 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20  ction--;.    }. 
10a40 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
10a50 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72  y(pRef);.  }.  r
10a60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20  eturn rc;.}.    
10a70 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68     ../*.** If th
10a80 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
10a90 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
10aa0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
10ab0 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
10ac0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10ad0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
10ae0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
10af0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
10b00 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
10b10 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
10b20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
10b30 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
10b40 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
10b50 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
10b60 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
10b70 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10b80 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
10b90 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20  g cursors, this 
10ba0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
10bb0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
10bc0 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
10bd0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
10be0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10bf0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10c00 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
10c10 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
10c20 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
10c30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10c40 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10c50 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
10c60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10c70 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
10c80 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
10c90 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
10ca0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  =0 ){.    if( sq
10cb0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
10cc0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e  nt(pBt->pPager)>
10cd0 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =1 ){.      asse
10ce0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
10cf0 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 20 20  >aData );.      
10d00 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
10d10 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  >pPage1);.    }.
10d20 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
10d30 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
10d40 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64  * Create a new d
10d50 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
10d60 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
10d70 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  t page of the.**
10d80 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10d90 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
10da0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
10db0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
10dc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10dd0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
10de0 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
10df0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10e00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10e10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
10e20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
10e30 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
10e40 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
10e50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e60 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b  OK || nPage>0 ){
10e70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10e80 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
10e90 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
10ea0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
10eb0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
10ec0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10ed0 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
10ee0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
10ef0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
10f00 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
10f10 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
10f20 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
10f30 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
10f40 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
10f50 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
10f60 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
10f70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
10f80 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
10f90 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
10fa0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
10fb0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
10fc0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
10fd0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
10fe0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
10ff0 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
11000 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
11010 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
11020 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
11030 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
11040 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
11050 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
11060 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
11070 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
11080 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
11090 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
110a0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
110b0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
110c0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
110d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
110e0 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
110f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
11100 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
11110 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
11120 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
11130 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
11140 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
11150 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
11160 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
11170 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
11180 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
11190 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
111a0 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
111b0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
111c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
111d0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
111e0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
111f0 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
11200 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
11210 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
11220 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
11230 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
11240 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
11250 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
11260 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
11270 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
11280 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
11290 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
112a0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
112b0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
112c0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
112d0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
112e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
112f0 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
11300 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
11310 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
11320 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
11330 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
11340 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
11350 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
11360 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
11370 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
11380 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
11390 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
113a0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
113b0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
113c0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
113d0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
113e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
113f0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
11400 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
11410 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
11420 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
11430 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
11440 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
11450 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
11460 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
11470 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
11480 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
11490 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
114a0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
114b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
114c0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
114d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
114e0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
114f0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
11500 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
11510 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
11520 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
11530 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
11540 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
11550 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
11560 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
11570 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
11580 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
11590 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
115a0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
115b0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
115c0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
115d0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
115e0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
115f0 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
11600 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
11610 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
11620 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
11630 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
11640 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
11650 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
11660 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
11670 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
11680 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
11690 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
116a0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
116b0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
116c0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
116d0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
116e0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
116f0 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
11700 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
11710 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
11720 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
11730 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
11740 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
11750 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
11760 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
11770 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
11780 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
11790 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
117a0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
117b0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
117c0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
117d0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
117e0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
117f0 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
11800 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
11810 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
11820 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
11830 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
11840 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
11850 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
11860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11870 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
11880 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
11890 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
118a0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
118b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
118c0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
118d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
118e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
118f0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
11900 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
11910 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
11920 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
11930 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
11940 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
11950 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
11960 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
11970 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
11980 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
11990 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
119a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
119b0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
119c0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
119d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
119e0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
119f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
11a00 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
11a10 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
11a20 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
11a30 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
11a40 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
11a50 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
11a60 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
11a70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11a80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
11a90 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
11aa0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
11ab0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
11ac0 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
11ad0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
11ae0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
11af0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
11b00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
11b10 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
11b20 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
11b30 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
11b40 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
11b50 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
11b60 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
11b70 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
11b80 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
11b90 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
11ba0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
11bb0 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50  ITE) || pBt->isP
11bc0 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42  ending ){.    pB
11bd0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
11be0 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
11bf0 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
11c00 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
11c10 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
11c20 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
11c30 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
11c40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
11c50 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
11c60 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
11c70 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
11c80 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
11c90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11ca0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
11cb0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
11cc0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
11cd0 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
11ce0 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
11cf0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
11d00 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
11d10 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
11d20 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
11d30 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
11d40 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
11d50 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
11d60 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
11d70 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
11d80 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
11d90 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
11da0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
11db0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
11dc0 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
11dd0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
11de0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
11df0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
11e00 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
11e10 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
11e20 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
11e30 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
11e40 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
11e50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
11e60 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
11e70 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
11e80 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
11e90 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
11ea0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
11eb0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
11ec0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
11ed0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
11ee0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
11ef0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11f00 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
11f10 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
11f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
11f30 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
11f40 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
11f50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11f60 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11f80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11f90 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
11fa0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
11fb0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
11fc0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
11fd0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
11fe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ff0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
12000 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
12010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12020 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
12030 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12040 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
12050 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
12060 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
12070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
12080 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
12090 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
120a0 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
120b0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
120c0 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
120d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
120e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
120f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
12100 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
12110 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
12120 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ++;.    }.    p-
12130 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
12140 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
12150 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
12160 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
12170 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12180 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
12190 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
121a0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
121b0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
121c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
121d0 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61  HE.    if( wrfla
121e0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
121f0 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
12200 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
12210 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
12220 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69    pBt->isExclusi
12230 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67  ve = (u8)(wrflag
12240 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  >1);.    }.#endi
12250 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
12260 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
12270 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
12280 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
12290 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
122a0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
122b0 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
122c0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
122d0 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
122e0 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
122f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
12300 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
12310 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
12320 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
12330 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
12340 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
12350 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
12360 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12370 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
12380 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
12390 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
123a0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
123b0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
123c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
123d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
123e0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
123f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12400 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
12410 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
12420 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
12430 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
12440 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
12450 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
12460 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
12470 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
12480 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
12490 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
124a0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
124b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
124c0 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
124d0 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
124e0 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
124f0 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
12520 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
12530 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12560 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
12570 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
12580 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
125b0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
125c0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
125d0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
125e0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
125f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
12600 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
12610 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12620 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
12630 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
12640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12650 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
12660 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
12670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
12680 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
12690 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
126a0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
126b0 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
126c0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
126d0 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
126e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
126f0 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  , i);..    rc = 
12700 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
12710 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
12720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
12740 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
12750 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
12760 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
12770 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
12780 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
12790 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
127a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
127b0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
127c0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
127d0 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  REE, pgno);.    
127e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
127f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63  _OK ) goto set_c
12800 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
12810 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
12820 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
12830 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
12840 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
12850 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
12860 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
12870 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  8]);.    rc = pt
12880 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
12890 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
128a0 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  TREE, pgno);.  }
128b0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
128c0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
128d0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
128e0 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
128f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
12900 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c  ewhere on pPage,
12910 20 77 68 69 63 68 20 69 73 20 67 75 61 72 61 6e   which is guaran
12920 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72  teed to be a btr
12930 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20  ee page, not an 
12940 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
12950 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
12960 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f  o page iFrom. Mo
12970 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
12980 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
12990 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50  nts to.** iTo. P
129a0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
129b0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
129c0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  e of pointer to 
129d0 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
129e0 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
129f0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
12a00 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
12a10 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
12a20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
12a30 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
12a60 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
12a70 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
12a80 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
12a90 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
12aa0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
12ab0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12ac0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
12ad0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
12ae0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
12af0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
12b00 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
12b10 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
12b20 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
12b30 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
12b40 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
12b50 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
12b60 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
12b70 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
12b80 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
12b90 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
12ba0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
12bb0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
12bc0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
12bd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12be0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
12bf0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12c00 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
12c10 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
12c20 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
12c30 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
12c40 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
12c50 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
12c60 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
12c70 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
12c80 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
12c90 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
12ca0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
12cb0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
12cc0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
12cd0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12ce0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
12cf0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
12d00 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
12d10 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
12d20 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
12d30 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
12d40 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
12d50 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ll;..    sqlite3
12d60 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
12d70 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
12d80 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
12d90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
12da0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
12db0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
12dc0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
12dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
12de0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
12df0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
12e00 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
12e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
12e20 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
12e30 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
12e40 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
12e50 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
12e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12e70 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
12e80 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
12e90 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
12ea0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
12eb0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
12ec0 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12ee0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
12ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
12f10 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
12f20 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
12f30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
12f40 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
12f50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12f70 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
12f80 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
12f90 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
12fa0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
12fb0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
12fc0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
12fd0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
12fe0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
12ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13000 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
13010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13020 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
13030 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
13040 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
13050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
13060 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
13070 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
13080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13090 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
130a0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
130b0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
130c0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
130d0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
130e0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
130f0 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
13100 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
13110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
13120 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
13130 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
13140 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
13150 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
13160 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
13170 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
13180 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
131b0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
131c0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
131d0 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
131e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
131f0 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
13200 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
13210 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
13220 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
13230 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
13240 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
13250 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
13260 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  mit.){.  MemPage
13270 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
13280 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
13290 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
132a0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
132b0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
132c0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
132d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
132e0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
132f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
13300 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
13310 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
13320 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
13330 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
13340 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
13350 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
13360 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
13370 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13380 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13390 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
133a0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
133b0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
133c0 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
133d0 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
133e0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
133f0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
13400 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
13410 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
13420 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
13430 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
13440 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
13450 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
13460 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
13470 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
13480 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13490 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
134a0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
134b0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
134c0 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
134d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
134e0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
134f0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
13500 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
13510 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
13520 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
13530 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
13540 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
13550 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
13560 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
13570 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
13580 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
13590 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
135a0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
135b0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
135c0 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
135d0 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
135e0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
135f0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
13600 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
13610 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
13620 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
13630 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
13640 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
13650 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
13660 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
13670 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
13680 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
13690 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
136a0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
136b0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
136c0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
136d0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
136e0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
136f0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
13700 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
13710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13730 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13740 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
13750 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
13760 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
13770 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
13780 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
13790 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
137a0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
137b0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
137c0 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
137d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
137f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
13800 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
13810 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
13820 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
13830 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
13840 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
13850 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
13860 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
13870 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
13880 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
13890 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
138a0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
138b0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
138c0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
138d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
138e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
138f0 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
13900 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
13910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13920 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13930 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13940 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
13950 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
13960 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
13970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13980 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
13990 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
139a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
139b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
139c0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
139d0 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
139e0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
139f0 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
13a00 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
13a10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
13a30 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13a40 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
13a50 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20  pe, iPtrPage);. 
13a60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
13a80 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
13a90 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
13aa0 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
13ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
13ac0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
13ad0 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
13ae0 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
13af0 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
13b00 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
13b10 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
13b20 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
13b30 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
13b40 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
13b50 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
13b60 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
13b70 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
13b80 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
13b90 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
13ba0 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
13bb0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
13bc0 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
13bd0 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
13be0 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
13bf0 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
13c00 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
13c10 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
13c20 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
13c30 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
13c40 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
13c50 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
13c60 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
13c70 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
13c80 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
13c90 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
13ca0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
13cb0 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
13cc0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
13cd0 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
13ce0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
13cf0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
13d00 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
13d10 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
13d20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
13d30 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
13d40 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
13d50 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
13d60 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
13d70 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
13d80 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
13d90 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
13da0 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20  Pgno iLastPg){. 
13db0 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
13dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13dd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
13de0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
13df0 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
13e00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13e10 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13e20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
13e30 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
13e40 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
13e50 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
13e60 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
13e70 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
13e80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74  (pBt) ){.    int
13e90 20 72 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70   rc;.    u8 eTyp
13ea0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
13eb0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
13ec0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
13ed0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
13ee0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
13ef0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
13f00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13f10 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
13f20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
13f30 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
13f40 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
13f50 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
13f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13f90 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
13fa0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
13fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
13fc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
13fd0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
13fe0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
13ff0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  E ){.      if( n
14000 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Fin==0 ){.      
14010 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
14020 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
14030 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
14040 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
14050 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
14060 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65  f nFin is non-ze
14070 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
14080 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
14090 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
140a0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
140b0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
140c0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
140d0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
140e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
140f0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
14100 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
14110 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
14120 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
14130 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
14140 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
14150 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
14160 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
14170 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
14180 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
14190 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20   iLastPg, 1);.  
141a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
141b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
141c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
141d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
141e0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
141f0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
14200 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14210 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
14220 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
14230 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
14240 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
14250 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
14260 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
14270 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
14280 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
14290 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  tPg;..      rc =
142a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
142b0 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
142c0 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
142d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
142e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
142f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14300 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
14310 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f   If nFin is zero
14320 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
14330 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
14340 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
14350 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
14360 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
14370 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
14380 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
14390 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
143a0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
143b0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46  ther hand, if nF
143c0 69 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68  in is greater th
143d0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
143e0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
143f0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
14400 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
14410 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
14420 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
14430 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
14440 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
14450 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  /.      do {.   
14460 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
14470 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
14480 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
14490 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
144a0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30  ePg, &iFreePg, 0
144b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
144c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
144d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
144e0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
144f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14500 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14510 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
14520 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
14530 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46        }while( nF
14540 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67  in!=0 && iFreePg
14550 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
14560 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
14570 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
14580 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14590 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
145a0 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  astPg->pDbPage);
145b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
145c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
145d0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
145e0 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
145f0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
14600 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46  age, iFreePg, nF
14610 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  in!=0);.      }.
14620 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14630 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
14640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
14660 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14670 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
14680 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20  f( nFin==0 ){.  
14690 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
146a0 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d   while( iLastPg=
146b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
146c0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
146d0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
146e0 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tPg) ){.      if
146f0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
14700 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b  pBt, iLastPg) ){
14710 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
14720 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69   *pPg;.        i
14730 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  nt rc = sqlite3B
14740 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
14750 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20   iLastPg, &pPg, 
14760 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
14770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14780 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
14790 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
147a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
147b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
147c0 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
147d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
147e0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
147f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14800 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
14810 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14830 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
14840 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
14850 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
14860 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c  (pBt->pPager, iL
14870 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  astPg);.  }.  re
14880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14890 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
148a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
148b0 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
148c0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
148d0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
148e0 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
148f0 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
14900 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
14910 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
14920 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
14930 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
14940 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
14950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
14960 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
14970 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
14980 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
14990 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
149a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
149b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
149c0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
149d0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
149e0 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
149f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
14a00 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
14a10 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
14a20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14a30 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
14a40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
14a60 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
14a70 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
14a80 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14a90 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
14aa0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
14ab0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14ac0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
14ad0 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
14ae0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
14af0 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
14b00 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
14b10 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67  pBt, 0, pagerPag
14b20 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20  ecount(pBt));.  
14b30 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
14b40 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14b50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14b60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
14b70 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
14b80 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
14b90 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
14ba0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
14bb0 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  ited for an auto
14bc0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
14bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
14be0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
14bf0 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
14c00 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
14c10 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
14c20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14c30 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
14c40 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
14c50 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
14c60 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
14c70 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
14c80 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
14c90 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
14ca0 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
14cb0 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
14cc0 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
14cd0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
14ce0 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
14cf0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14d00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
14d10 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
14d20 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
14d30 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
14d40 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
14d50 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
14d60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14d70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14d80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
14d90 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
14da0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
14db0 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
14dc0 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
14dd0 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
14de0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
14df0 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  in;.    Pgno nFr
14e00 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74  ee;.    Pgno nPt
14e10 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20 69  rmap;.    Pgno i
14e20 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Free;.    const 
14e30 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
14e40 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 50 67  pageSize;.    Pg
14e50 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72  no nOrig = pager
14e60 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
14e70 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
14e80 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
14e90 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
14ea0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
14eb0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
14ec0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
14ed0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
14ee0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
14ef0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
14f00 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
14f10 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
14f20 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
14f30 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
14f40 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
14f50 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
14f60 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
14f70 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
14f80 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
14f90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14fa0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
14fb0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
14fc0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14fd0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
14fe0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
14ff0 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
15000 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
15010 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
15020 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e  5);.    nFin = n
15030 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
15040 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20  Ptrmap;.    if( 
15050 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
15060 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
15070 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
15080 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
15090 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
150a0 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
150b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
150c0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
150d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
150e0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
150f0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
15100 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
15110 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
15120 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
15130 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
15140 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
15150 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
15160 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
15170 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
15180 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
15190 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   iFree);.    }. 
151a0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
151b0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
151c0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
151d0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
151e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
151f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15200 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
15210 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
15220 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
15230 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
15240 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
15250 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
15260 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
15270 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
15280 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
15290 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
152a0 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20  Pager, nFin);.  
152b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
152c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
152e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
152f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
15300 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
15310 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
15320 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
15330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
15340 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
15350 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15360 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
15370 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
15380 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
15390 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
153a0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
153b0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
153c0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
153d0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
153e0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
153f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
15400 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
15410 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
15420 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
15430 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
15440 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
15450 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
15460 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
15470 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
15480 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
15490 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
154a0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
154b0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
154c0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
154d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
154e0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
154f0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
15500 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
15510 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
15520 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
15530 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
15540 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
15550 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
15560 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
15570 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
15580 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
15590 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
155a0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
155b0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
155c0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
155d0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
155e0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
155f0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
15600 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
15610 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
15620 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
15630 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
15640 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
15650 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
15660 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
15670 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
15680 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
15690 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
156a0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
156b0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
156c0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
156d0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
156e0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
156f0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
15700 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
15710 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
15720 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
15730 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
15740 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
15750 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
15760 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
15770 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
15780 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
15790 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
157a0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
157b0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
157c0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
157d0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
157e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
157f0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
15800 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
15810 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
15820 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
15830 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
15840 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
15850 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
15860 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
15870 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
15880 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
15890 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
158a0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
158b0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
158c0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
158d0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
158e0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
158f0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
15900 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
15910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
15920 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
15930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
15940 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15950 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
15960 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15970 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
15980 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15990 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
159a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
159b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
159c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
159d0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
159e0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
159f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15a20 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
15a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15a40 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
15a50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15a60 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
15a70 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
15a80 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
15a90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15aa0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
15ab0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15ac0 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
15ad0 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
15ae0 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
15af0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15b00 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
15b10 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
15b20 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
15b30 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
15b40 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
15b50 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
15b60 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
15b70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
15b80 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
15b90 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
15ba0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
15bb0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
15bc0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
15bd0 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
15be0 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
15bf0 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
15c00 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
15c10 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
15c20 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
15c30 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
15c40 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
15c50 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
15c60 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
15c70 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
15c80 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
15c90 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
15ca0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
15cb0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
15cc0 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
15cd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15ce0 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
15cf0 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
15d00 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
15d10 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
15d20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15d30 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
15d40 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
15d50 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
15d60 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
15d70 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
15d80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15d90 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
15da0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
15db0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15dc0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
15dd0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15de0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
15df0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
15e00 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
15e10 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15e20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
15e30 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
15e40 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15e50 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
15e60 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
15e70 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
15e80 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
15e90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
15ea0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
15eb0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
15ec0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15ed0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
15ee0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
15ef0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
15f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15f10 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
15f20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15f30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
15f50 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15f60 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
15f70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
15f80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15f90 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
15fa0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
15fb0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
15fc0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
15fd0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
15fe0 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
15ff0 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
16000 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
16010 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
16020 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
16030 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
16040 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
16050 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
16060 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
16070 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
16080 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
16090 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
160a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
160b0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
160c0 4f 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  ONE ){.    clear
160d0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
160e0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
160f0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
16100 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
16110 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
16120 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
16130 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
16140 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
16150 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
16160 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
16170 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
16180 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
16190 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74 68 65   unlock.  ** the
161a0 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
161b0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
161c0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
161d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
161e0 20 2a 2f 0a 20 20 62 74 72 65 65 43 6c 65 61 72   */.  btreeClear
161f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
16200 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
16210 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e  TRANS_NONE;.  un
16220 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
16230 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65  d(pBt);..  btree
16240 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
16250 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16260 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
16270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16280 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
16290 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
162a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
162b0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
162c0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
162d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
162e0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
162f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
16300 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
16310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16320 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
16330 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
16340 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20  tPhaseTwo(p);.  
16350 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
16360 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16370 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
16380 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
16390 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
163a0 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
163b0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
163c0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
163d0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
163e0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
163f0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
16400 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
16410 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
16420 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
16430 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
16440 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
16450 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
16460 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
16470 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
16480 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
16490 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
164a0 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
164b0 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
164c0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
164d0 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
164e0 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
164f0 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
16500 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
16510 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
16520 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
16530 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
16540 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
16550 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
16560 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
16570 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
16580 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
16590 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
165a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
165b0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
165c0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
165d0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
165e0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
165f0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
16600 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16610 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
16620 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
16630 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
16640 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
16650 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
16660 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
16670 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
16680 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
16690 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
166a0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
166b0 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
166c0 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
166d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
166e0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
166f0 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
16700 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
16710 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
16720 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
16730 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
16740 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
16750 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
16760 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
16770 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
16780 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
16790 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
167a0 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
167b0 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
167c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
167d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
167e0 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
167f0 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
16800 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
16810 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
16820 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
16830 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
16840 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
16850 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
16860 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
16870 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
16880 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
16890 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
168a0 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
168b0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c  Cursor *p;.  sql
168c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
168d0 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
168e0 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
168f0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
16900 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
16910 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
16920 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
16930 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
16940 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
16950 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72     p->skip = err
16960 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
16970 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
16980 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
16990 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
169a0 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
169b0 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
169c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
169d0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
169e0 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
169f0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
16a00 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
16a10 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
16a20 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
16a30 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
16a40 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
16a50 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
16a60 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
16a70 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
16a80 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
16a90 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
16aa0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
16ab0 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
16ac0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
16ad0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
16ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16af0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
16b00 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
16b10 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
16b20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
16b30 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
16b40 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
16b50 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
16b60 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
16b70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16b80 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
16b90 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
16ba0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16bb0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
16bc0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
16bd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16be0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16bf0 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
16c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
16c10 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
16c20 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
16c30 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
16c40 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
16c50 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79  hilst.    ** try
16c60 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73  ing to save curs
16c70 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66  or positions. If
16c80 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
16c90 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28  matic rollback (
16ca0 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  as.    ** the re
16cb0 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72  sult of a constr
16cc0 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66  aint, malloc() f
16cd0 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72  ailure or IO err
16ce0 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a  or) then .    **
16cf0 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62   the cache may b
16d00 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63  e internally inc
16d10 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63  onsistent (not c
16d20 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65  ontain valid tre
16d30 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65  es) so.    ** we
16d40 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72   cannot simply r
16d50 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
16d60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49  to the caller. I
16d70 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20  nstead, abort . 
16d80 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65     ** all querie
16d90 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
16da0 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63  ing any of the c
16db0 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c  ursors that fail
16dc0 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20  ed to save..    
16dd0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
16de0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
16df0 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65  s(p, rc);.  }.#e
16e00 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65  ndif.  btreeInte
16e10 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
16e20 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
16e30 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
16e40 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
16e50 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
16e60 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
16e70 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
16e80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
16e90 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
16ea0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
16eb0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
16ec0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
16ed0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
16ee0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
16ef0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
16f00 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
16f10 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
16f20 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74  * call sqlite3Bt
16f30 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
16f40 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
16f50 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
16f60 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
16f70 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
16f80 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
16f90 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
16fa0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
16fb0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
16fc0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
16fd0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
16fe0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
16ff0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
17000 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
17010 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
17020 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
17030 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
17040 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
17050 4e 45 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 41  NE ){.    clearA
17060 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
17070 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
17080 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
17090 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
170a0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
170b0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
170c0 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
170d0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
170e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
170f0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
17100 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65     }.  }..  btre
17110 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
17120 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
17130 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
17140 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
17150 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
17160 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
17170 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
17180 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
171a0 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
171b0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
171c0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
171d0 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62  action can can b
171e0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
171f0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
17200 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
17210 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
17220 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
17230 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
17240 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
17250 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
17260 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
17270 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
17280 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
17290 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
172a0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
172b0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
172c0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
172d0 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
172e0 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
172f0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
17300 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
17310 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
17320 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
17330 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
17340 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
17350 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
17360 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
17370 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
17380 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
17390 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
173a0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
173b0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
173c0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
173d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
173e0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
173f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
17400 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
17410 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
17420 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
17430 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
17440 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
17450 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
17460 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
17470 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
17480 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
17490 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
174a0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
174b0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
174c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
174d0 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
174e0 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
174f0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
17500 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
17510 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
17520 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
17530 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
17540 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
17550 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
17560 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
17570 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
17580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17590 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
175a0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
175b0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
175c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
175d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
175e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
175f0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
17600 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
17610 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
17620 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  t( pBt->readOnly
17630 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
17640 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
17650 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
17660 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
17670 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28  vepoint );.  if(
17680 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e   NEVER(p->inTran
17690 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
176a0 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29  | pBt->readOnly)
176b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
176c0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
176d0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
176e0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
176f0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
17700 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20  TE );.    /* At 
17710 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
17720 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
17730 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
17740 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20  vepoint with.   
17750 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
17760 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
17770 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
17780 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
17790 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61  g.    ** SQL sta
177a0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
177b0 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
177c0 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
177d0 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73  ack any.    ** s
177e0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
177f0 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
17800 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
17810 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
17820 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ve..    */.    r
17830 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17840 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
17850 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
17860 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
17870 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17880 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
178a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
178b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
178c0 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
178d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
178e0 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
178f0 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
17900 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
17910 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
17920 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
17930 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
17940 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
17950 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
17960 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
17970 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
17980 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
17990 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
179a0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
179b0 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
179c0 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
179d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
179e0 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
179f0 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
17a00 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
17a10 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
17a20 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
17a30 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
17a40 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
17a50 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
17a60 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
17a70 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
17a80 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
17a90 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
17aa0 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
17ab0 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
17ac0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
17ad0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
17ae0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
17af0 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
17b00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
17b20 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
17b30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
17b40 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
17b50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
17b60 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
17b70 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
17b80 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
17b90 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
17ba0 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
17bb0 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
17bc0 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
17bd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
17be0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
17bf0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17c10 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42  agerSavepoint(pB
17c20 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69  t->pPager, op, i
17c30 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
17c40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17c50 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17c60 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
17c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
17c80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17c90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17ca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
17cb0 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
17cc0 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
17cd0 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
17ce0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
17cf0 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
17d00 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
17d10 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
17d20 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
17d30 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
17d40 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
17d50 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17d60 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
17d70 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
17d80 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
17d90 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
17da0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
17db0 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
17dc0 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
17dd0 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
17de0 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
17df0 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
17e00 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
17e10 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
17e20 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
17e30 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
17e40 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
17e50 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
17e60 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
17e70 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
17e80 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
17e90 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
17ea0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
17eb0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
17ec0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
17ed0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
17ee0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
17ef0 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
17f00 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
17f10 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
17f20 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
17f30 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
17f40 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
17f50 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
17f60 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
17f70 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
17f80 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
17f90 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
17fa0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
17fb0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
17fc0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
17fd0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
17fe0 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
17ff0 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
18000 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
18010 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
18020 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
18030 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
18040 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
18050 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
18060 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
18070 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
18080 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
18090 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
180a0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
180b0 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
180c0 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
180d0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
180e0 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
180f0 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
18100 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
18110 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d  ize() bytes of m
18120 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65  emory .** pointe
18130 64 20 74 6f 20 62 79 20 70 43 75 72 20 68 61 76  d to by pCur hav
18140 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  e been zeroed by
18150 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
18160 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
18170 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
18180 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
181b0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
181e0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
181f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
18200 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
18230 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
18240 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
18250 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
18260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18270 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
18280 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
18290 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
182a0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
182b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
182c0 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
182d0 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  or */.){.  int r
182e0 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  c;.  Pgno nPage;
182f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18300 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
18310 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
18320 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
18330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
18340 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
18350 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77 72 46  ==1 );.  if( wrF
18360 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  lag ){.    asser
18370 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
18380 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  y );.    if( NEV
18390 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ER(pBt->readOnly
183a0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
183b0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
183c0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  Y;.    }.    rc 
183d0 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
183e0 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
183f0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
18400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18410 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
18430 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  ED_SHAREDCACHE )
18440 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18450 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
18460 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  if( pBt->pPage1=
18470 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  =0 ){.    rc = l
18480 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
18490 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  y(p);.    if( rc
184a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
184b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
184c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
184d0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
184e0 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20  no)iTable;.  rc 
184f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
18500 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
18510 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
18520 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63 21 3d  ge); .  if( rc!=
18530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
18550 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
18560 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  && nPage==0 ){. 
18570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
18580 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63  MPTY;.    goto c
18590 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
185a0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63  eption;.  }.  rc
185b0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
185c0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
185d0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
185e0 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20  Page[0]);.  if( 
185f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18600 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
18610 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
18620 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
18630 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
18640 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
18650 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
18660 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
18670 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
18680 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
18690 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
186a0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
186b0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
186c0 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
186d0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
186e0 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
186f0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
18700 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
18710 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
18720 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
18730 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
18740 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
18750 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
18760 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
18770 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
18780 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
18790 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
187a0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
187b0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
187c0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
187d0 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
187e0 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
187f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18800 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72  _OK;..create_cur
18810 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20  sor_exception:. 
18820 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
18830 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
18840 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
18850 75 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74  used(pBt);.  ret
18860 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  urn rc;.}.int sq
18870 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
18880 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
188c0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
188f0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
18900 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
18910 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18940 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
18950 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
18960 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
18970 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
18980 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
18990 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
189a0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
189b0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
189e0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
189f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
18a00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18a10 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
18a20 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
18a30 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
18a40 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
18a50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18a60 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18a70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18a80 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
18a90 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
18aa0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
18ab0 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
18ac0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
18ad0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
18ae0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
18af0 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
18b00 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
18b10 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
18b20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
18b30 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
18b40 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
18b50 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
18b60 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
18b70 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
18b80 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
18b90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18ba0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
18bb0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
18bc0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
18bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
18be0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
18bf0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
18c00 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
18c10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
18c20 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
18c30 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
18c40 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
18c50 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
18c60 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
18c70 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
18c80 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
18c90 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
18ca0 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
18cb0 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
18cc0 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
18cd0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
18ce0 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
18cf0 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
18d00 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
18d10 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
18d20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
18d30 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
18d40 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
18d50 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
18d60 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
18d70 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
18d80 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
18d90 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
18da0 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
18db0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
18dc0 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
18dd0 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
18de0 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
18df0 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
18e00 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
18e10 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
18e20 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
18e30 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
18e40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
18e50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
18e60 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
18e70 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
18e80 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
18e90 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
18ea0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
18eb0 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
18ec0 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
18ed0 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
18ee0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18ef0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
18f00 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
18f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18f20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
18f30 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
18f40 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
18f50 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
18f60 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
18f70 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
18f80 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
18f90 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
18fa0 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
18fb0 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
18fc0 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
18fd0 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
18fe0 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
18ff0 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
19000 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
19010 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
19020 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
19030 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
19040 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
19050 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
19060 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
19070 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
19080 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
19090 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
190a0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
190b0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
190c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
190d0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
190e0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
190f0 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
19100 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
19110 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
19120 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
19130 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
19140 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
19150 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
19160 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
19170 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
19180 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
19190 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
191a0 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
191b0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
191c0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
191d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
191e0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
191f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
19200 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
19210 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
19220 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
19230 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
19240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
19250 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
19260 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
19270 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
19280 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
19290 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
192a0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
192b0 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
192c0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
192d0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
192e0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
192f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19300 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
19310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
19330 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
19340 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
19350 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
19360 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
19370 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
19380 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
19390 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
193a0 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  e Btree..*/.void
193b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
193c0 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
193d0 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
193e0 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
193f0 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
19400 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19410 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d  tex(pCur) );.  m
19420 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
19430 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43  pCur, sizeof(BtC
19440 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70  ursor));.  pTemp
19450 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
19460 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
19470 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  v = 0;.  for(i=0
19480 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69  ; i<=pTempCur->i
19490 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
194a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
194b0 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65  pTempCur->apPage
194c0 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
194d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65   }.  assert( pTe
194e0 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29  mpCur->pKey==0 )
194f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
19500 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
19510 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
19520 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
19530 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
19540 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
19550 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
19560 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
19570 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
19580 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
19590 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
195a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
195b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f  ex(pCur) );.  fo
195c0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
195d0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
195e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
195f0 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ef(pCur->apPage[
19600 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
19610 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
19620 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a  (pCur->pKey);.}.
19630 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  .../*.** Make su
19640 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
19650 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
19660 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
19670 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
19680 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
19690 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
196a0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
196b0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
196c0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
196d0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
196e0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
196f0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
19700 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
19710 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
19720 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
19730 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
19740 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
19750 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
19760 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
19770 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
19780 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
19790 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
197a0 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
197b0 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
197c0 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
197d0 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
197e0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
197f0 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
19800 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
19810 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
19820 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
19830 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
19840 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
19850 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
19860 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
19870 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
19880 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
19890 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
198a0 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
198b0 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
198c0 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
198d0 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
198e0 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
198f0 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
19900 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
19910 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
19920 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
19930 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
19940 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
19950 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
19960 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
19970 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
19980 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
19990 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
199a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
199b0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
199c0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
199d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
199e0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
199f0 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
19a00 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
19a10 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
19a20 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
19a30 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
19a40 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
19a50 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
19a60 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
19a70 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
19a80 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
19a90 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
19aa0 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
19ab0 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
19ac0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
19ad0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
19ae0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
19af0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
19b00 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
19b10 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 73 71  >iPage;.      sq
19b20 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
19b30 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
19b40 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
19b50 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
19b60 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
19b70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
19b80 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
19b90 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
19ba0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
19bb0 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
19bc0 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
19bd0 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
19be0 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
19bf0 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
19c00 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
19c10 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
19c20 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
19c30 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
19c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
19c70 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
19c80 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
19cc0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
19cd0 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
19d10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
19d20 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
19d30 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
19d40 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
19d50 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a  &pCur->info); \.
19d60 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
19d70 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Key = 1;        
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
19db0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e00 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c  \.    assertCell
19e10 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20  Info(pCur);     
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e50 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   \.  }.#endif /*
19e60 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a   _MSC_VER */../*
19e70 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
19e80 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
19e90 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
19ea0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
19eb0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
19ec0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
19ed0 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
19ee0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
19ef0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
19f00 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
19f10 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
19f20 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
19f30 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
19f40 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
19f50 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19f60 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
19f70 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
19f80 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
19f90 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  he key..*/.int s
19fa0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
19fb0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
19fc0 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
19fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19fe0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19ff0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a000 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1a010 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1a020 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1a030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1a040 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1a050 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1a060 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1a070 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1a080 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1a090 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a0a0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1a0b0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1a0c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1a0d0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1a0e0 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
1a0f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1a100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a110 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a120 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1a130 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1a140 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1a150 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1a160 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1a170 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77   points to.  Alw
1a180 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ays return SQLIT
1a190 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65  E_OK..** Failure
1a1a0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1a1b0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1a1c0 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
1a1d0 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  y.** pointing to
1a1e0 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68   an entry (which
1a1f0 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
1a200 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
1a210 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1a220 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69  empty) then *pSi
1a230 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ze is set to 0..
1a240 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a250 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
1a260 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1a270 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1a280 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1a290 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1a2a0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1a2b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1a2c0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1a2d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a2e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a2f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a300 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1a310 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1a320 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1a330 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1a340 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1a350 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
1a360 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1a370 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65  valid entry - se
1a380 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a  t *pSize to 0. *
1a390 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  /.      *pSize =
1a3a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1a3b0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1a3c0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1a3d0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1a3e0 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  o.nData;.    }. 
1a3f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a400 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1a410 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1a420 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1a430 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1a440 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1a450 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1a460 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1a470 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1a480 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1a490 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1a4a0 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1a4b0 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1a4c0 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1a4d0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1a4e0 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1a4f0 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1a500 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1a510 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1a520 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1a530 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1a540 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1a550 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a560 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1a570 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1a580 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1a590 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1a5a0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1a5b0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1a5c0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1a5d0 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1a5e0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1a5f0 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1a600 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1a610 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1a620 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1a630 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1a640 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1a650 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1a660 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1a670 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1a680 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1a690 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1a6a0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1a6b0 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1a6c0 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1a6d0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1a6e0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1a6f0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1a700 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1a710 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1a720 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1a730 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1a740 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1a750 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1a760 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1a770 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1a780 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1a790 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1a7a0 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1a7b0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1a7c0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1a7d0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1a7e0 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c  t, .  Pgno ovfl,
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
1a810 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  age */.  MemPage
1a820 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1a830 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1a840 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1a850 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1a860 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a880 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1a890 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1a8a0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1a8b0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1a8c0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1a8d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a8e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1a8f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a900 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1a910 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1a920 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1a930 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1a940 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1a950 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1a960 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1a970 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1a980 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1a990 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1a9a0 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1a9b0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1a9c0 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1a9d0 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1a9e0 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1a9f0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1aa00 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1aa10 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1aa20 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1aa30 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1aa40 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1aa50 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1aa60 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1aa70 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1aa80 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1aa90 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1aaa0 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1aab0 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1aac0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1aad0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1aae0 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1aaf0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1ab00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1ab10 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1ab20 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1ab30 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1ab40 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1ab50 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1ab60 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1ab70 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1ab80 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1ab90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aba0 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1abb0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1abc0 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1abd0 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1abe0 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1abf0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1ac00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ac10 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
1ac20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1ac40 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ac50 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30   ovfl, &pPage, 0
1ac60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63  );.    assert(rc
1ac70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1ac80 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66  Page==0);.    if
1ac90 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d  ( next==0 && rc=
1aca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1acb0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
1acc0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1acd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1ace0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
1acf0 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
1ad00 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
1ad10 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
1ad20 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1ad30 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
1ad40 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
1ad50 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
1ad60 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
1ad70 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
1ad80 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
1ad90 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
1ada0 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
1adb0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
1adc0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1add0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
1ade0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1adf0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
1ae00 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
1ae10 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
1ae20 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
1ae30 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
1ae40 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
1ae50 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
1ae60 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
1ae70 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
1ae80 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
1ae90 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
1aea0 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
1aeb0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
1aec0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1aed0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
1aee0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
1aef0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
1af00 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1af10 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
1af20 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
1af30 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1af40 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
1af50 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
1af60 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1af70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
1af80 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
1af90 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1afa0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1afb0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
1afc0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
1afd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1afe0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
1aff0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
1b020 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
1b030 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
1b040 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
1b050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1b060 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
1b070 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
1b080 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
1b090 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
1b0a0 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
1b0b0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
1b0c0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
1b0d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1b0e0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
1b0f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1b110 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b120 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
1b130 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
1b140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1b150 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1b160 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
1b170 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1b180 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
1b190 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
1b1a0 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
1b1b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b1d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1b1e0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
1b1f0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
1b200 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
1b210 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1b220 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
1b230 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66   pointing to. If
1b240 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61   the eOp.** para
1b250 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73  meter is 0, this
1b260 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
1b270 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65  tion (data copie
1b280 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72  d into.** buffer
1b290 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73   pBuf). If it is
1b2a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69   non-zero, a wri
1b2b0 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  te (data copied 
1b2c0 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70  from.** buffer p
1b2d0 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  Buf)..**.** A to
1b2e0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
1b2f0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
1b300 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
1b310 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1b320 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
1b330 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
1b340 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
1b350 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1b360 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73  s not make a dis
1b370 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e  tinction between
1b380 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a   key and data..*
1b390 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20  * It just reads 
1b3a0 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20  or writes bytes 
1b3b0 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64  from the payload
1b3c0 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67   area.  Data mig
1b3d0 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e  ht .** appear on
1b3e0 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
1b3f0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
1b400 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
1b410 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
1b420 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
1b430 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62  BtCursor.isIncrb
1b440 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1b450 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63  s set, and the c
1b460 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72  urrent.** cursor
1b470 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
1b480 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
1b490 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e   pages, this fun
1b4a0 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
1b4b0 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  es space for and
1b4c0 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65   lazily popluate
1b4d0 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
1b4e0 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63  age-list .** cac
1b4f0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
1b500 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53  or.aOverflow). S
1b510 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1b520 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68  use this.** cach
1b530 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
1b540 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
1b550 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66  d offset more ef
1b560 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
1b570 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1b580 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1b590 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1b5a0 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
1b5b0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
1b5c0 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
1b5d0 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
1b5e0 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
1b5f0 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
1b600 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
1b610 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
1b620 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
1b630 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
1b640 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1b650 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
1b660 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
1b670 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1b680 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
1b690 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1b6a0 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
1b6b0 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
1b6c0 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
1b6d0 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
1b6e0 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
1b6f0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
1b700 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
1b710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
1b720 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
1b730 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1b740 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1b750 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
1b760 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1b770 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
1b780 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
1b790 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
1b7a0 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
1b7b0 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
1b7c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
1b7d0 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1b7e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1b7f0 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
1b800 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
1b810 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
1b820 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c   .  int skipKey,
1b830 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73           /* offs
1b840 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74  et begins at dat
1b850 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1b860 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20  e */.  int eOp  
1b870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1b880 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
1b890 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
1b8a0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1b8b0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1b8c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b8d0 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
1b8e0 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
1b8f0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1b900 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1b910 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1b920 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
1b930 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
1b940 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1b950 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
1b980 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1b990 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1b9a0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1b9b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1b9c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1b9d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b9e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1b9f0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1ba00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1ba10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ba20 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
1ba30 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
1ba40 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
1ba50 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
1ba60 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1ba70 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
1ba80 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28  ->intKey ? 0 : (
1ba90 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1baa0 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69  Key);..  if( ski
1bab0 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73  pKey ){.    offs
1bac0 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  et += nKey;.  }.
1bad0 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1bae0 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
1baf0 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20  fo.nData .   || 
1bb00 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1bb10 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1bb20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1bb30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1bb40 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1bb50 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1bb60 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1bb70 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1bb80 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1bb90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bba0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1bbb0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1bbc0 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1bbd0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1bbe0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1bbf0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1bc00 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1bc10 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1bc20 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1bc30 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1bc40 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1bc50 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1bc60 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1bc70 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1bc80 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1bc90 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1bca0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1bcb0 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1bcc0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1bcd0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1bce0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1bcf0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1bd00 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1bd10 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1bd20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bd30 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1bd40 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1bd50 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1bd60 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1bd70 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1bd80 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1bd90 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1bda0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1bdb0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1bdc0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1bdd0 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1bde0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bdf0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1be00 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1be10 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1be20 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1be30 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1be40 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1be50 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1be60 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1be70 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1be80 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1be90 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1bea0 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1beb0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1bec0 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1bed0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1bee0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1bef0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1bf00 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1bf10 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1bf20 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1bf30 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1bf40 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1bf50 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1bf60 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1bf70 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1bf80 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1bf90 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1bfa0 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1bfb0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1bfc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1bfd0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1bfe0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1bff0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1c000 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1c010 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1c020 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1c030 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1c040 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1c050 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
1c060 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
1c070 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1c080 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c090 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1c0a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c0b0 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
1c0c0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1c0d0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1c0e0 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
1c0f0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1c100 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
1c110 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1c120 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
1c130 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
1c140 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
1c150 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1c160 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1c170 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
1c180 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
1c190 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
1c1a0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
1c1b0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
1c1c0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
1c1d0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
1c1e0 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
1c1f0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1c200 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
1c210 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1c220 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
1c230 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
1c240 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1c250 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
1c260 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
1c270 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
1c280 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1c290 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
1c2a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1c2b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1c2c0 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
1c2d0 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
1c2e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1c2f0 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
1c300 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
1c310 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
1c320 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
1c330 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
1c340 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
1c350 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
1c360 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
1c370 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
1c380 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
1c390 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1c3a0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
1c3b0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1c3c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1c3d0 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
1c3e0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
1c3f0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
1c400 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
1c410 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
1c420 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
1c430 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
1c440 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
1c450 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
1c460 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
1c470 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
1c480 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
1c490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c4a0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1c4b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1c4c0 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1c4d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1c4e0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
1c4f0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1c500 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1c510 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
1c520 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
1c530 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
1c540 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
1c550 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
1c560 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1c570 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
1c580 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
1c590 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
1c5a0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
1c5b0 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
1c5c0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
1c5d0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1c5e0 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
1c5f0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
1c600 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
1c610 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
1c620 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1c630 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1c640 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
1c650 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
1c660 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c670 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
1c680 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
1c690 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1c6a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
1c6c0 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
1c6d0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
1c6e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1c6f0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
1c700 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
1c710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
1c720 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
1c730 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1c740 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
1c750 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1c760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1c770 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
1c780 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
1c790 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
1c7a0 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
1c7b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1c7c0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
1c7d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
1c7e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
1c7f0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1c800 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
1c810 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
1c820 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c840 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1c850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c860 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c870 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
1c890 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
1c8a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1c8b0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1c8c0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1c8d0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1c8e0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1c8f0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1c900 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1c910 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1c920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1c930 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1c940 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1c950 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1c960 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1c970 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c980 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1c990 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1c9a0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1c9b0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1c9c0 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
1c9d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1c9e0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1c9f0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1ca00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ca10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ca20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1ca30 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1ca40 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1ca50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ca60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1ca70 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1ca80 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1ca90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1caa0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1cab0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1cac0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1cad0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61    if( pCur->apPa
1cae0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
1caf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cb00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1cb10 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
1cb20 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1cb30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1cb40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1cb50 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1cb60 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
1cb70 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1cb80 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
1cb90 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
1cba0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
1cbb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1cbc0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
1cbd0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
1cbe0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1cbf0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1cc00 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1cc10 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1cc20 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1cc30 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1cc40 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1cc50 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
1cc60 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1cc70 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1cc80 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1cc90 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1cca0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1ccb0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1ccc0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1ccd0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1cce0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1ccf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1cd00 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
1cd10 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
1cd20 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
1cd30 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
1cd40 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
1cd50 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1cd60 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
1cd70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1cd80 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1cd90 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
1cda0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1cdb0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1cdc0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cdd0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1cde0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1cdf0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1ce00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ce10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ce20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ce30 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
1ce40 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
1ce50 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1ce60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1ce70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1ce80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1ce90 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
1cea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1ceb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
1cec0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
1ced0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
1cee0 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29  amt, pBuf, 1, 0)
1cef0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cf00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1cf10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1cf20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1cf30 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
1cf40 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
1cf50 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
1cf60 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
1cf70 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
1cf80 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
1cf90 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
1cfa0 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
1cfb0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
1cfc0 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
1cfd0 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
1cfe0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
1cff0 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
1d000 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
1d010 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
1d020 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
1d030 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
1d040 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
1d050 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
1d060 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
1d070 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d080 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1d090 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
1d0a0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
1d0b0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
1d0c0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
1d0d0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
1d0e0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
1d0f0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
1d100 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
1d110 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
1d120 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
1d130 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
1d140 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
1d150 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
1d160 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
1d170 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
1d180 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
1d190 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
1d1a0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
1d1b0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
1d1c0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
1d1d0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
1d1e0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
1d1f0 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
1d200 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
1d210 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
1d220 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
1d230 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
1d240 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
1d250 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1d260 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
1d270 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
1d280 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
1d290 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
1d2a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d2b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
1d2c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1d2d0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
1d2e0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1d2f0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
1d300 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
1d310 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
1d320 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
1d330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1d340 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1d350 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
1d360 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
1d370 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
1d380 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
1d390 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
1d3a0 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
1d3b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1d3c0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
1d3d0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
1d3e0 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e  32 nKey;.  u32 n
1d3f0 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
1d400 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
1d410 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1d420 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1d430 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
1d440 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1d450 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1d460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1d470 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1d480 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
1d490 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d4a0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
1d4b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1d4c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1d4d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1d4e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1d4f0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1d500 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1d510 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
1d520 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
1d530 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
1d540 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1d550 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
1d560 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69  e{.    nKey = (i
1d570 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1d580 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
1d590 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
1d5a0 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
1d5b0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
1d5c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1d5d0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
1d5e0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
1d5f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1d600 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b     if( nLocal>nK
1d610 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  ey ){.      nLoc
1d620 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d  al = nKey;.    }
1d630 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
1d640 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
1d650 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
1d660 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
1d670 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
1d680 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
1d690 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
1d6a0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
1d6b0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
1d6c0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
1d6d0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
1d6e0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
1d6f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
1d700 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
1d710 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
1d720 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
1d730 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
1d740 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
1d750 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
1d760 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
1d770 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
1d780 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
1d790 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
1d7a0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
1d7b0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
1d7c0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
1d7d0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
1d7e0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
1d7f0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
1d800 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
1d810 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
1d820 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
1d830 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
1d840 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
1d850 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
1d860 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
1d870 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
1d880 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
1d890 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
1d8a0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1d8b0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
1d8c0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1d8d0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1d8e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d8f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1d900 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1d910 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d920 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d930 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1d940 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1d950 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1d960 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1d970 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1d980 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1d990 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1d9a0 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64   0;.}.const void
1d9b0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
1d9c0 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
1d9d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1d9e0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1d9f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1da00 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1da10 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
1da20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1da30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1da40 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1da50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1da60 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1da70 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1da80 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1da90 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
1daa0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
1dab0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1dac0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
1dad0 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
1dae0 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
1daf0 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
1db00 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1db10 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
1db20 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ove to..*/.stati
1db30 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
1db40 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1db50 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
1db60 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1db70 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
1db80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
1db90 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
1dba0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1dbb0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
1dbc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1dbd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1dbe0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1dbf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1dc00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1dc10 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
1dc20 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
1dc30 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
1dc40 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1dc50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
1dc60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dc70 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1dc80 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1dc90 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1dca0 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
1dcb0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1dcc0 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
1dcd0 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
1dce0 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
1dcf0 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
1dd00 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
1dd10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1dd20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1dd30 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1dd40 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
1dd50 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  l<1 ){.    retur
1dd60 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1dd70 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1dd80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dd90 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1dda0 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
1ddb0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
1ddc0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
1ddd0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
1dde0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
1ddf0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
1de00 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1de10 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
1de20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
1de30 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
1de40 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
1de50 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
1de60 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1de70 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
1de80 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
1de90 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
1dea0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
1deb0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
1dec0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ded0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1dee0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
1def0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
1df00 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
1df10 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
1df20 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
1df30 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
1df40 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
1df50 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1df60 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
1df70 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
1df80 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
1df90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1dfa0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1dfb0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
1dfc0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
1dfd0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
1dfe0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
1dff0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
1e000 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
1e010 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1e020 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1e030 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1e040 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1e050 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1e060 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1e070 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1e080 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1e090 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1e0a0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1e0b0 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1e0c0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1e0d0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1e0e0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1e0f0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1e100 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1e110 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
1e120 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1e130 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
1e140 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1e150 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e160 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e170 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e180 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e1a0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
1e1b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1e1c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e1d0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
1e1e0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
1e1f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e200 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1e210 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e220 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
1e230 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
1e240 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
1e250 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
1e260 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1e270 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1e280 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
1e290 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1e2a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1e2b0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1e2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1e2d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1e2e0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74   root page.*/.st
1e2f0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1e300 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
1e310 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1e320 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
1e330 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
1e340 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
1e350 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
1e360 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1e370 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1e380 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e390 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1e3a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
1e3b0 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1e3c0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1e3d0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
1e3e0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
1e3f0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
1e400 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
1e410 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
1e420 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
1e430 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
1e440 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1e450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1e460 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e470 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
1e480 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
1e490 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  p;.    }.    sql
1e4a0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1e4b0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
1e4c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
1e4d0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=0 ){.    int
1e4e0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
1e4f0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1e500 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1e510 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1e520 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1e530 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1e540 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
1e550 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
1e560 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
1e570 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
1e580 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29  Cur->apPage[0]))
1e590 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1e5a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1e5b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1e5c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e5d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74    }.  }..  pRoot
1e5e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1e5f0 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
1e600 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
1e610 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70  >pgnoRoot );.  p
1e620 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
1e630 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
1e640 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1e650 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1e660 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
1e670 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1e680 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
1e690 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
1e6a0 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
1e6b0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
1e6c0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
1e6d0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
1e6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e6f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
1e700 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1e710 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1e720 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1e730 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1e740 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1e750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1e760 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1e770 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1e780 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1e790 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1e7a0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1e7b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e7c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
1e7d0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
1e7e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1e7f0 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1e800 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e810 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1e820 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1e830 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
1e840 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1e850 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
1e860 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1e870 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1e880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
1e890 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
1e8a0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
1e8b0 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
1e8c0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
1e8d0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1e8e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1e8f0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
1e900 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1e910 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1e920 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e930 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1e940 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1e950 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e960 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e970 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e980 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e990 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e9a0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1e9b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e9c0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1e9d0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
1e9e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1e9f0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1ea00 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1ea10 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1ea20 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1ea30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1ea40 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
1ea50 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ea60 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1ea70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ea80 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1ea90 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1eaa0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1eab0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1eac0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1ead0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1eae0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1eaf0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1eb00 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1eb10 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1eb20 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1eb30 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1eb40 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1eb50 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1eb60 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1eb70 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1eb80 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1eb90 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1eba0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1ebb0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1ebc0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1ebd0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1ebe0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1ebf0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1ec00 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1ec10 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1ec20 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1ec30 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1ec40 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1ec50 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1ec60 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1ec70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1ec80 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1ec90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1eca0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ecb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1ecc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ecd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ece0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1ecf0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1ed00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1ed10 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
1ed20 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1ed30 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1ed40 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1ed50 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1ed60 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1ed70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1ed80 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1ed90 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1eda0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1edb0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1edc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1edd0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ede0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1edf0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
1ee00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1ee10 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1ee20 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
1ee30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ee40 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ee50 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
1ee60 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1ee70 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1ee80 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1ee90 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1eea0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1eeb0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1eec0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1eed0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1eee0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1eef0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1ef00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
1ef10 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
1ef20 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1ef30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1ef40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ef50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ef60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ef70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1ef80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1ef90 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1efa0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1efb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1efc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1efd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1efe0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1eff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1f000 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f010 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1f020 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1f030 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1f040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1f060 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1f070 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1f080 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
1f090 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1f0a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1f0b0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1f0c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f0d0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1f0e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1f0f0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1f100 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1f110 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1f120 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1f130 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1f140 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1f150 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1f160 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1f170 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1f180 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1f190 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f1a0 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
1f1b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1f1c0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1f1d0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
1f1e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f1f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f200 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f210 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1f220 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1f230 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1f240 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
1f250 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
1f260 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
1f270 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
1f280 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
1f290 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75  r->eState && pCu
1f2a0 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66  r->atLast ){.#if
1f2b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f2c0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
1f2d0 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
1f2e0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
1f2f0 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
1f300 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
1f310 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1f320 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
1f330 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
1f340 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1f350 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
1f360 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
1f370 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
1f380 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
1f390 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
1f3a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1f3b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f3c0 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
1f3d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f3e0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
1f3f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1f400 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1f410 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
1f420 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
1f430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1f440 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1f450 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1f460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f470 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
1f480 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1f490 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1f4a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1f4b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f4c0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
1f4d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1f4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f4f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1f500 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f510 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
1f520 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1f530 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
1f540 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
1f550 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1f560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
1f570 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1f580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1f590 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1f5a0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
1f5b0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
1f5c0 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
1f5d0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
1f5e0 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
1f5f0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
1f600 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
1f610 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
1f620 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
1f630 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
1f640 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
1f650 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1f660 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
1f670 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
1f680 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
1f690 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
1f6a0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
1f6b0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
1f6c0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
1f6d0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
1f6e0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
1f6f0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
1f700 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
1f710 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
1f720 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
1f730 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
1f740 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
1f750 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
1f760 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
1f770 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
1f780 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
1f790 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
1f7a0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
1f7b0 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
1f7c0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
1f7d0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
1f7e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
1f7f0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
1f800 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
1f810 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
1f820 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
1f830 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1f840 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1f850 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1f860 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1f870 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1f880 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1f890 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1f8a0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
1f8b0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
1f8c0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
1f8f0 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
1f900 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
1f910 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
1f920 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
1f930 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1f940 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1f950 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1f960 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
1f970 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
1f980 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
1f990 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
1f9a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1f9b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1f9c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1f9d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1f9e0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
1f9f0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
1fa00 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
1fa10 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
1fa20 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
1fa30 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
1fa40 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1fa50 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
1fa60 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1fa70 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
1fa80 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
1fa90 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
1faa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1fab0 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
1fac0 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
1fad0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
1fae0 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
1faf0 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
1fb00 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
1fb10 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
1fb20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1fb30 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1fb40 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1fb50 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1fb60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1fb70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1fb80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1fb90 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1fba0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1fbb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1fbc0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
1fbd0 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
1fbe0 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
1fbf0 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
1fc00 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
1fc10 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
1fc20 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
1fc30 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
1fc40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1fc50 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
1fc60 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
1fc70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
1fc80 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
1fc90 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1fca0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
1fcb0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1fcc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fcd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1fce0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
1fcf0 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
1fd00 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
1fd10 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
1fd20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1fd30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1fd40 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
1fd50 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1fd60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1fd70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1fd80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
1fd90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1fda0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
1fdb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1fdc0 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
1fdd0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1fde0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1fdf0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
1fe00 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
1fe10 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
1fe20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1fe30 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
1fe40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fe50 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1fe60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1fe70 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
1fe80 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
1fe90 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
1fea0 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
1feb0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
1fec0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
1fed0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1fee0 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ge];.    int c =
1fef0 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
1ff00 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
1ff10 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
1ff20 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
1ff30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
1ff40 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
1ff50 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e 74  if( (!pPage->int
1ff60 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d  Key && pIdxKey==
1ff70 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20  0) || upr<0 ){. 
1ff80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ff90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ffa0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1ffb0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
1ffc0 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
1ffd0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1ffe0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1fff0 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20  e] = (u16)upr;. 
20000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20010 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20020 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
20030 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20  ((upr+lwr)/2);. 
20040 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
20050 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20  {.      int idx 
20060 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
20070 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49  ur->iPage]; /* I
20080 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
20090 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
200a0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
200b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
200c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
200d0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
200e0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
200f0 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  /..      pCur->i
20100 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
20110 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
20120 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
20130 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
20140 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  PtrSize;.      i
20150 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
20160 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
20170 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
20180 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
20190 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
201a0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
201b0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
201c0 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
201d0 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
201e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
201f0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
20200 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
20210 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
20220 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
20230 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
20240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
20250 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
20260 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
20270 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
20280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
20290 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
202a0 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
202b0 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
202c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
202d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
202e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
202f0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
20300 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d  CellKey;.      }
20310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
20320 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
20330 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
20340 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e   is 32768 bytes.
20350 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
20360 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
20370 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
20380 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
20390 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
203a0 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
203b0 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d   ** page is at m
203c0 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20  ost 8198 bytes, 
203d0 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f  which may be sto
203e0 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
203f0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
20400 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
20410 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
20420 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
20430 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
20440 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
20450 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
20460 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
20470 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
20480 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
20490 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
204a0 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
204b0 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
204c0 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
204d0 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
204e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
204f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20500 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65   int nCell = pCe
20510 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
20520 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38  f( !(nCell & 0x8
20530 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61  0) && nCell<=pPa
20540 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
20550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
20560 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
20570 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
20580 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
20590 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
205a0 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
205b0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
205c0 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
205d0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
205e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
205f0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
20600 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
20610 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20620 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
20630 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
20640 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
20650 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
20660 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
20670 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
20680 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
20690 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
206a0 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
206b0 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
206c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
206d0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
206e0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
206f0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
20700 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
20710 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
20720 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
20730 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
20740 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
20750 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20760 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
20770 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
20780 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
20790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
207a0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
207b0 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
207c0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
207d0 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
207e0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
207f0 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
20800 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
20810 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
20820 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
20830 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
20840 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
20850 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
20860 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
20870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
20880 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
20890 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
208a0 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
208b0 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
208c0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
208d0 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
208e0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
208f0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
20900 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
20910 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
20920 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
20930 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
20940 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
20950 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
20960 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
20970 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
20980 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
20990 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b  Malloc( nCell );
209a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
209b0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
209c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
209d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
209e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
209f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
20a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20a10 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
20a20 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
20a30 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
20a40 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
20a50 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
20a60 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
20a70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
20a80 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
20a90 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
20aa0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20ab0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
20ac0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
20ad0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
20ae0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20af0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
20b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
20b10 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
20b20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
20b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
20b40 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
20b50 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
20b60 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
20b70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20b80 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
20b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
20ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20bb0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
20bc0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
20bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20be0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
20bf0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
20c00 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
20c10 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
20c20 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
20c30 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
20c40 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
20c50 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20c60 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
20c70 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
20c80 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
20c90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
20ca0 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
20cb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20cc0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
20cd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
20ce0 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
20cf0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
20d00 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
20d10 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
20d20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
20d30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
20d40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
20d50 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
20d60 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
20d70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
20d80 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
20d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
20da0 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
20db0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20dc0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20dd0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
20de0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
20df0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ll );.      if( 
20e00 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63  pRes ) *pRes = c
20e10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
20e20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
20e30 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
20e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
20e50 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20e60 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
20e70 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
20e80 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
20e90 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
20ea0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
20eb0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
20ec0 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
20ed0 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
20ee0 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
20ef0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
20f00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20f10 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
20f20 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
20f30 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
20f40 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
20f50 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
20f60 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
20f70 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
20f80 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
20f90 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
20fa0 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
20fb0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
20fc0 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
20fd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20fe0 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
20ff0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
21000 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
21010 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
21020 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
21030 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
21040 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
21050 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
21060 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
21070 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
21080 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
21090 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
210a0 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
210b0 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
210c0 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
210d0 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
210e0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
210f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
21100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
21110 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
21120 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
21130 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
21150 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
21160 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
21170 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
21180 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
21190 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b  /.  char aSpace[
211a0 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  150];          /
211b0 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72  * Temp space for
211c0 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76   pIdxKey - to av
211d0 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a  oid a malloc */.
211e0 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
211f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
21200 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
21210 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
21220 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
21230 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
21240 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
21250 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
21290 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66  aSpace));.    if
212a0 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
212b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
212c0 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
212d0 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
212e0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
212f0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
21300 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
21310 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
21320 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Res);.  if( pKey
21330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
21340 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
21350 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29  dRecord(pIdxKey)
21360 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21370 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
21380 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
21390 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
213a0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
213b0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
213c0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
213d0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
213e0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
213f0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
21400 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
21410 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
21420 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
21430 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
21440 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
21450 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
21460 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
21470 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
21480 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
21490 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
214a0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
214b0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
214c0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
214d0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
214e0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
214f0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
21500 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
21510 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
21520 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
21530 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
21540 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
21550 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
21560 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
21570 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
21580 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
21590 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
215a0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
215b0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
215c0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
215d0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
215e0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
215f0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
21600 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
21610 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
21620 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
21630 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
21640 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
21650 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
21660 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
21670 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
21680 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
21690 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
216a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
216b0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
216c0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
216d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
216e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
216f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21700 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
21710 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
21720 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
21730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21740 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21750 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
21760 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
21770 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
21780 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
21790 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
217a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
217b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
217c0 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
217d0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
217e0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
217f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21800 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
21810 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
21820 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21830 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21840 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
21850 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21860 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
21870 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
21880 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
21890 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
218a0 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
218b0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
218c0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
218d0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
218e0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
218f0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
21900 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
21910 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
21920 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
21930 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
21940 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
21950 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
21960 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
21970 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
21980 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
21990 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
219a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
219b0 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
219c0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
219d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
219e0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
219f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
21a00 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
21a10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
21a20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
21a30 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
21a40 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
21a50 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
21a60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
21a70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
21a80 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
21a90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21aa0 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
21ab0 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
21ac0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
21ad0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
21ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21af0 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
21b00 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
21b10 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
21b20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
21b30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21b40 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
21b50 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
21b60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
21b70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21b80 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
21b90 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
21ba0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
21bb0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
21bc0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
21bd0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
21be0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
21bf0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
21c00 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
21c10 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
21c20 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
21c30 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
21c40 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
21c50 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
21c60 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
21c70 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
21c80 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
21c90 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
21ca0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
21cb0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
21cc0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
21cd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
21ce0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
21cf0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21d00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21d10 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
21d20 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
21d30 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
21d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21d50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21d60 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
21d70 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
21d80 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
21d90 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
21da0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
21db0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21dc0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
21dd0 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
21de0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
21df0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
21e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21e10 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
21e20 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
21e30 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21e40 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
21e50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
21e60 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
21e70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
21e80 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
21e90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21ea0 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
21eb0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
21ec0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
21ed0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
21ee0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
21ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21f00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
21f10 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
21f20 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
21f30 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
21f40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21f50 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
21f60 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
21f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
21f80 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
21f90 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
21fa0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
21fb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
21fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
21fd0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
21fe0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
21ff0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
22000 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
22010 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
22020 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
22030 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
22040 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
22050 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
22060 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22070 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
22080 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
22090 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
220a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
220b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
220c0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
220d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
220e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
220f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
22100 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
22110 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
22120 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
22130 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
22140 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
22150 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
22160 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
22170 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
22180 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
22190 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
221a0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
221b0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
221c0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
221d0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
221e0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
221f0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
22200 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
22210 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
22220 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
22230 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
22240 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
22250 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
22260 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
22270 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
22280 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
22290 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
222a0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
222b0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
222c0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
222d0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
222e0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
222f0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
22300 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
22310 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
22320 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
22330 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
22340 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
22350 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
22360 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
22370 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
22380 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
22390 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
223a0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
223b0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
223c0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
223d0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
223e0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
223f0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
22400 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
22410 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
22420 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
22430 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
22440 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
22450 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
22460 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
22470 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
22480 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
22490 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
224a0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
224b0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
224c0 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
224d0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
224e0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
224f0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
22500 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
22510 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
22520 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
22530 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
22540 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
22550 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
22560 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
22570 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
22580 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
22590 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
225a0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
225b0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
225c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
225d0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
225e0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
225f0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
22600 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
22610 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
22620 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
22630 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
22640 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
22650 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
22660 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
22670 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
22680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22690 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
226a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
226b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
226c0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
226d0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
226e0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
226f0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
22700 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22710 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
22720 20 69 66 28 20 6e 3e 6d 78 50 61 67 65 20 29 7b   if( n>mxPage ){
22730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22740 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22750 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
22760 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
22770 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
22780 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
22790 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
227a0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
227b0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
227c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
227d0 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
227e0 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
227f0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
22800 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
22810 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
22820 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
22830 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
22840 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
22850 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
22860 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
22870 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
22880 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
22890 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
228a0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
228b0 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
228c0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
228d0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
228e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
228f0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
22900 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
22910 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
22920 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
22930 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
22940 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22950 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22960 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
22970 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
22980 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
22990 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
229a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
229b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
229c0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
229d0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
229e0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
229f0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
22a00 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
22a10 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
22a20 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
22a30 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
22a40 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
22a50 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
22a60 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
22a70 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
22a80 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
22a90 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
22aa0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
22ab0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
22ac0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
22ad0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
22ae0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
22af0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
22b00 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
22b10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
22b20 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
22b30 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
22b40 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
22b50 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
22b60 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
22b70 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
22b80 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
22b90 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
22ba0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
22bb0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
22bc0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
22bd0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
22be0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
22bf0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
22c00 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
22c10 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
22c20 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
22c30 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
22c40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
22c50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22c60 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
22c70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
22c80 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
22c90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22ca0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
22cb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22cc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22cd0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
22ce0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22cf0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
22d00 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
22d10 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
22d20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
22d30 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
22d40 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
22d50 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
22d60 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
22d70 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
22d80 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
22d90 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
22da0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
22db0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
22dc0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
22dd0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
22de0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
22df0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
22e00 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
22e10 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
22e20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
22e30 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
22e40 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
22e50 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
22e60 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
22e70 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
22e80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
22e90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22ea0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
22eb0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
22ec0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
22ed0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
22ee0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
22ef0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
22f00 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
22f10 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
22f20 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
22f30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
22f40 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
22f50 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
22f60 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
22f70 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
22f80 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
22f90 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
22fa0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
22fb0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
22fc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
22fd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
22fe0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20  4 - 2 ){.       
22ff0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
23000 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
23010 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
23020 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
23030 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
23040 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
23050 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
23060 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
23070 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23080 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
23090 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
230a0 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
230b0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
230c0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
230d0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
230e0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
230f0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
23100 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
23110 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
23120 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
23130 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
23140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
23150 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
23160 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
23170 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
23180 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
23190 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
231a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
231b0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
231c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
231d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
231e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
231f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
23200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23210 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
23220 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
23230 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
23240 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
23250 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
23260 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
23270 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
23280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23290 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
232a0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
232b0 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
232c0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
232d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
232e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
232f0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67  /* The trunk pag
23300 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  e is required by
23310 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20   the caller but 
23320 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20  it contains .   
23330 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
23340 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20  rs to free-list 
23350 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73  leaves. The firs
23360 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61  t leaf becomes a
23370 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20   trunk.         
23380 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73   ** page in this
23390 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20   case..         
233a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65   */.          Me
233b0 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b  mPage *pNewTrunk
233c0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  ;.          Pgno
233d0 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74   iNewTrunk = get
233e0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
233f0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
23400 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e      if( iNewTrun
23410 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20  k>mxPage ){ .   
23420 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23430 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23440 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
23450 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
23460 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
23470 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
23480 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
23490 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
234a0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
234b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
234c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
234d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
234e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
234f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
23500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
23510 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
23520 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
23530 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
23540 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23560 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
23570 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
23580 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
23590 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
235a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
235b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
235c0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
235d0 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
235e0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
235f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
23600 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
23610 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
23620 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
23630 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
23640 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
23650 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
23660 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
23670 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
23680 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23690 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
236a0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
236b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
236c0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
236d0 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
236e0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
236f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
23700 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
23710 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
23720 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
23730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23740 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
23750 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
23760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
23770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23780 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
23790 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
237a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
237b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
237c0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
237d0 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
237e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
237f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
23800 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
23810 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
23820 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
23830 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
23840 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
23850 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
23860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23870 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
23880 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
23890 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  k */.        int
238a0 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
238b0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
238c0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
238d0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
238e0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
238f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23900 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
23910 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
23920 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
23930 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
23940 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
23950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23960 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
23970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
23980 20 69 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20   i, dist;.      
23990 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
239a0 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
239b0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
239c0 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  a[8]) - nearby;.
239d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69            if( di
239e0 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64  st<0 ) dist = -d
239f0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
23a00 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
23a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
23a20 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65  nt d2 = get4byte
23a30 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
23a40 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20  - nearby;.      
23a50 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29        if( d2<0 )
23a60 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20   d2 = -d2;.     
23a70 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
23a80 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
23a90 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
23aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
23ab0 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
23ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
23ae0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
23af0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
23b00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
23b10 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
23b20 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
23b30 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
23b40 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
23b50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23b60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23b70 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
23b80 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
23b90 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
23ba0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
23bb0 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
23bc0 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
23bd0 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
23be0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
23bf0 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
23c00 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
23c10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
23c20 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
23c30 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
23c40 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
23c50 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
23c60 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
23c70 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
23c80 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
23c90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23ca0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23cb0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
23cc0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
23cd0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
23ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
23cf0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
23d00 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
23d10 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
23d20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
23d30 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
23d40 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
23d60 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
23d70 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
23d80 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
23d90 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
23da0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
23db0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
23dc0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
23dd0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
23de0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23df0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
23e00 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
23e10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23e20 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
23e30 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
23e40 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
23e50 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
23e60 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
23e70 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
23e80 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
23e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
23ea0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
23eb0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
23ec0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
23ed0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23f00 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
23f10 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
23f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23f40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
23f50 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
23f60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
23f70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
23f80 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
23f90 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
23fa0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23fb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
23fc0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
23fd0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
23fe0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
23ff0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
24000 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
24010 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
24020 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
24030 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
24040 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
24050 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
24060 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  le */.    int nP
24070 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
24080 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a  ount(pBt);.    *
24090 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20  pPgno = nPage + 
240a0 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67  1;..    if( *pPg
240b0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
240c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
240d0 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
240e0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
240f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24100 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
24110 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
24120 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
24130 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
24140 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
24150 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
24160 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
24170 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
24180 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
24190 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
241a0 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
241b0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
241c0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
241d0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
241e0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
241f0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
24200 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
24210 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
24220 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
24230 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
24240 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
24250 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
24260 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
24270 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
24280 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
24290 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
242a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
242b0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
242c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
242d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
242e0 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  gno, &pPg, 0);. 
242f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24320 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
24330 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
24340 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
24350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24360 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
24370 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e  rc;.      (*pPgn
24380 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  o)++;.      if( 
24390 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
243a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
243b0 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a  { (*pPgno)++; }.
243c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
243d0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
243e0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
243f0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
24400 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24410 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
24420 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  Pgno, ppPage, 0)
24430 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
24440 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
24450 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24460 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
24470 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
24480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24490 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
244a0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
244b0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
244c0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
244d0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
244e0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
244f0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
24500 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
24510 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
24520 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24530 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
24540 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
24550 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
24560 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
24570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
24580 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
24590 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
245a0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
245b0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
245c0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
245d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
245e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
245f0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
24600 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
24610 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
24620 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
24630 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24640 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
24650 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
24660 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
24670 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
24680 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
24690 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
246a0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
246b0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
246c0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
246d0 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
246e0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
246f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24700 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
24710 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
24720 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
24730 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
24740 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
24750 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
24760 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
24770 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
24780 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
24790 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
247a0 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
247b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
247c0 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
247d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
247e0 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
247f0 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
24800 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
24810 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
24820 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
24830 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
24840 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
24850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24860 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
24870 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
24880 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
24890 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
248a0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
248c0 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
248d0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
248e0 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24900 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
24910 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
24920 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
24930 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
24940 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
24950 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
24960 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
24970 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24980 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24990 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
249a0 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
249b0 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
249c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
249f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
24a20 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
24a30 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
24a40 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
24a50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
24a60 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
24a70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
24a80 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
24a90 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
24aa0 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
24ab0 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
24ac0 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
24ad0 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
24ae0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
24af0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
24b00 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
24b10 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
24b20 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
24b30 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
24b40 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
24b50 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
24b60 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
24b70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24b80 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
24b90 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
24ba0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
24bb0 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
24bc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
24bd0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
24be0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
24bf0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
24c00 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  e+1);..#ifdef SQ
24c10 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
24c20 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
24c30 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
24c40 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
24c50 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
24c60 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
24c70 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
24c80 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
24c90 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
24ca0 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ros..  */.  if( 
24cb0 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d  (!pPage && (rc =
24cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
24cd0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
24ce0 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
24cf0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
24d00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24d10 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
24d20 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
24d30 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
24d40 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
24d50 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
24d60 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
24d70 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
24d80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
24d90 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
24da0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
24db0 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
24dc0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
24dd0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
24de0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
24df0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
24e00 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
24e10 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
24e20 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
24e30 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
24e40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
24e50 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
24e60 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
24e70 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
24e80 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
24e90 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
24ea0 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
24eb0 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
24ec0 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
24ed0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
24ee0 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
24ef0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
24f00 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
24f10 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
24f20 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
24f30 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
24f40 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
24f50 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
24f60 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
24f70 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
24f80 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
24f90 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
24fa0 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
24fb0 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
24fc0 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
24fd0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
24fe0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
24ff0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
25000 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
25010 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
25020 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61   ){.    int nLea
25030 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
25040 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
25050 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
25060 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
25070 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
25080 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
25090 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
250a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
250b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
250c0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
250d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
250e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
250f0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
25100 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
25110 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
25120 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25130 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
25140 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20  nLeaf<0 ){.     
25150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
25160 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
25170 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
25180 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
25190 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61  ( nLeaf<pBt->usa
251a0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
251b0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
251c0 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
251d0 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
251e0 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
251f0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
25200 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
25210 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
25220 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
25230 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
25240 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
25250 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
25260 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
25270 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
25280 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
25290 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
252a0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
252b0 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
252c0 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
252d0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
252e0 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
252f0 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
25300 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
25310 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
25320 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
25330 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
25340 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
25350 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
25360 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
25370 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
25380 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
25390 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
253a0 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
253b0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
253c0 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
253d0 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
253e0 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
253f0 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
25400 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
25410 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
25420 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
25430 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
25440 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
25450 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
25460 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
25470 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
25480 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
25490 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
254a0 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
254b0 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
254c0 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
254d0 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
254e0 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
254f0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
25500 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
25510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25520 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
25530 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
25560 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
25570 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
25580 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
25590 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
255a0 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
255b0 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
255c0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
255d0 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28  LETE.        if(
255e0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
255f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
25600 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
25610 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25620 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
25630 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
25640 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
25650 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
25660 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
25670 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
25680 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
25690 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
256a0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
256b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
256c0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
256d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
256e0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
256f0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
25700 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
25710 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
25720 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
25730 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
25740 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
25750 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
25760 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
25770 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
25780 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
25790 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
257a0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
257b0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
257c0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
257d0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
257e0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
257f0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
25800 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
25810 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
25820 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
25830 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
25840 0a 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67  .  if(   ((!pPag
25850 65 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  e) && (0 != (rc 
25860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
25870 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
25880 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a  , &pPage, 0)))).
25890 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72       || (0 != (r
258a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
258b0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
258c0 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20  Page))).  ){.   
258d0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
258e0 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
258f0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
25900 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
25910 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
25920 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
25930 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
25940 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
25950 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
25960 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
25970 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
25980 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
25990 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
259a0 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
259b0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
259c0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
259d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
259e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
259f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
25a00 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
25a10 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
25a20 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
25a30 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
25a40 75 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50  urn freePage2(pP
25a50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
25a60 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d   pPage->pgno);.}
25a70 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
25a80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
25a90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
25aa0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
25ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
25ac0 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
25ad0 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
25ae0 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
25af0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
25b00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
25b10 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
25b20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
25b30 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
25b40 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c  Ovfl;.  u16 ovfl
25b50 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
25b60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25b70 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
25b80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
25b90 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
25ba0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
25bb0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
25bc0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
25bd0 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
25be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
25bf0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
25c00 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
25c10 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
25c20 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
25c30 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
25c40 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
25c50 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
25c60 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
25c70 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
25c80 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
25c90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
25ca0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
25cb0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
25cc0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
25cd0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
25ce0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
25cf0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
25d00 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
25d10 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
25d20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
25d30 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
25d40 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
25d50 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
25d60 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  2 || ovflPgno>pa
25d70 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
25d80 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
25d90 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
25da0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
25db0 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
25dc0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
25dd0 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
25de0 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
25df0 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
25e00 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
25e10 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
25e20 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
25e30 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
25e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25e50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
25e60 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
25e70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
25e80 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
25e90 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
25ea0 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
25eb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
25ec0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
25ed0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
25ee0 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
25ef0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  flPgno);.    if(
25f00 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
25f10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25f20 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
25f30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
25f40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25f50 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
25f60 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
25f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25f80 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
25f90 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
25fa0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
25fb0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
25fc0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
25fd0 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
25fe0 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
25ff0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
26000 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
26010 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
26020 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
26030 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
26040 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
26050 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
26060 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
26070 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
26080 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
26090 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
260a0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
260b0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
260c0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
260d0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
260e0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
260f0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
26100 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
26110 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
26120 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
26130 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
26140 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
26150 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
26160 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
26170 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
26180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26190 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
261a0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
261c0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
261d0 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
261e0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
261f0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
26200 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
26210 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
26220 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
26230 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
26240 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
26250 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
26260 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
26270 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
26280 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
26290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262a0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
262b0 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
262c0 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
262d0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
262f0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
26300 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
26310 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
26320 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
26330 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
26340 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
26350 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
26360 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
26370 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
26380 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
26390 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
263a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
263b0 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
263c0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
263d0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
263e0 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
263f0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
26400 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
26410 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26420 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
26430 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
26440 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
26450 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
26460 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
26470 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
26480 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
26490 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
264a0 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
264b0 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
264c0 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
264d0 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
264e0 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
264f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
26500 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
26510 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
26520 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
26530 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
26540 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
26550 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
26560 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
26570 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
26580 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
26590 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
265a0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
265b0 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
265c0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
265d0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
265e0 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
265f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
26600 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
26610 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
26620 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
26630 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
26640 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  )&nKey);.  sqlit
26650 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
26660 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
26670 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
26680 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
26690 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
266a0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
266b0 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
266c0 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
266d0 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
266e0 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
266f0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
26700 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
26710 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
26720 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
26730 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
26740 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
26750 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
26760 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
26770 73 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65  se{ .    if( nKe
26780 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
26790 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
267a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
267b0 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
267c0 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
267d0 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
267e0 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
267f0 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
26800 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
26810 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
26820 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
26830 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
26840 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
26850 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
26860 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
26870 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
26880 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
26890 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
268a0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
268b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
268c0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
268d0 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
268e0 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
268f0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
26900 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
26910 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
26920 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
26930 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
26940 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
26950 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
26960 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
26970 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
26980 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
26990 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
269a0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
269b0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
269c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
269d0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
269e0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
269f0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
26a00 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
26a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26a20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
26a30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
26a40 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
26a50 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
26a60 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
26a70 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
26a80 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
26a90 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
26aa0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
26ab0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
26ac0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
26ad0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
26ae0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
26af0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
26b00 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
26b10 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
26b20 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
26b30 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
26b40 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
26b50 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
26b60 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
26b70 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
26b80 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
26b90 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
26ba0 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
26bb0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
26bc0 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
26bd0 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
26be0 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
26bf0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
26c00 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
26c10 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
26c20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
26c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
26c40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26c50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
26c60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
26c70 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
26c80 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
26c90 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
26ca0 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
26cb0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
26cc0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
26cd0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29  ype, pgnoPtrmap)
26ce0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
26d00 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
26d10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26d20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
26d30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
26d40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26d50 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
26d60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26d70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
26d80 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
26d90 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
26da0 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
26db0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
26dc0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
26dd0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
26de0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
26df0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
26e00 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
26e10 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
26e20 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
26e30 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
26e40 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
26e50 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
26e60 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
26e70 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
26e80 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
26e90 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
26ea0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
26eb0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
26ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
26ed0 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
26ee0 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
26ef0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
26f00 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
26f10 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
26f20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
26f30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
26f40 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
26f50 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
26f60 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
26f70 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
26f80 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
26f90 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
26fa0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
26fb0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
26fc0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
26fd0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
26fe0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
26ff0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
27000 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
27010 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
27020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
27030 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
27040 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
27050 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
27060 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
27070 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
27080 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
27090 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
270a0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
270b0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
270c0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
270d0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
270e0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
270f0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
27100 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
27110 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
27120 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
27130 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
27140 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
27150 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
27160 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
27170 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
27180 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
27190 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
271a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
271b0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
271c0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
271d0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
271e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
271f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
27200 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
27210 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
27220 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
27230 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
27240 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
27250 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
27260 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
27270 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
27280 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
27290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
272a0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
272b0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
272c0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
272d0 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
272e0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
272f0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
27300 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
27310 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
27320 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
27330 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
27340 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
27350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
27360 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
27370 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
27380 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
27390 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
273a0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
273b0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
273c0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
273d0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
273e0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
273f0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
27400 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
27410 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
27420 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
27430 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
27440 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
27450 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
27460 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
27470 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
27480 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
27490 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
274a0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
274b0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
274c0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
274d0 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65   int dropCell(Me
274e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
274f0 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
27500 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
27510 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
27520 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
27530 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
27540 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
27550 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
27560 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
27570 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
27580 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
27590 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
275a0 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
275b0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
275c0 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
275d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
275e0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
275f0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
27600 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
27610 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
27620 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
27630 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
27640 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27650 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
27660 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
27670 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
27680 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27690 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
276a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
276b0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
276c0 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
276d0 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
276e0 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
276f0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
27700 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70  tr);.  if( (pc<p
27710 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
27720 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  6+(pPage->leaf?0
27730 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63  :4)).     || (pc
27740 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  +sz>pPage->pBt->
27750 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20  usableSize) ){. 
27760 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27770 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27780 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
27790 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
277a0 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  z);.  if( rc!=SQ
277b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
277c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
277d0 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
277e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
277f0 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
27800 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
27810 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
27820 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
27830 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
27840 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
27850 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
27860 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
27870 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
27880 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 2;.  return SQ
27890 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
278a0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
278b0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
278c0 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
278d0 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
278e0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
278f0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
27900 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
27910 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
27920 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
27930 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
27940 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
27950 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
27960 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
27970 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
27980 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
27990 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
279a0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
279b0 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
279c0 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
279d0 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
279e0 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
279f0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
27a00 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
27a10 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
27a20 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
27a30 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
27a40 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
27a50 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
27a60 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
27a70 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
27a80 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
27a90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
27aa0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
27ab0 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
27ac0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
27ad0 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
27ae0 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
27af0 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
27b00 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
27b10 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
27b20 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
27b30 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
27b40 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
27b50 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
27b60 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
27b70 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
27b80 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
27b90 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
27ba0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
27bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27bc0 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
27bd0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
27be0 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
27bf0 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
27c00 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
27c10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
27c20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
27c30 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
27c40 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
27c50 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
27c60 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
27c70 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
27c80 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
27c90 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
27ca0 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
27cb0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
27cc0 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
27cd0 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
27ce0 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
27cf0 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20  /.  u8 nSkip    
27d00 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
27d10 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
27d20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
27d30 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  he cell */.){.  
27d40 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
27d50 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
27d60 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
27d70 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
27d80 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
27d90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
27da0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
27db0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
27dc0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
27dd0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
27de0 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
27df0 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
27e00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
27e10 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
27e20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
27e30 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
27e40 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
27e50 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
27e60 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
27e70 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
27e80 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
27e90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
27ea0 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
27eb0 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
27ec0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
27ed0 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
27ee0 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
27ef0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
27f00 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
27f10 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
27f20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
27f30 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
27f40 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
27f50 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
27f60 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
27f70 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
27f80 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
27f90 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
27fa0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
27fb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
27fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27fd0 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
27fe0 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
27ff0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
28000 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
28010 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
28020 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
28030 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
28040 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
28050 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
28060 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61  e, pCell) );.  a
28070 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28080 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
28090 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
280a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
280b0 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
280c0 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
280d0 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
280e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
280f0 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b  mp+nSkip, pCell+
28100 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
28110 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
28120 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
28130 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
28140 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
28150 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
28160 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
28170 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
28180 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  aOvfl[0])) );.  
28190 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
281a0 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
281b0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
281c0 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29  l[j].idx = (u16)
281d0 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
281e0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
281f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28200 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28220 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
28230 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28240 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
28250 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28260 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
28270 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
28280 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
28290 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
282a0 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
282b0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
282c0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
282d0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
282e0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
282f0 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
28300 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
28310 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
28320 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
28330 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
28340 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
28350 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
28360 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
28370 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
283a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70       }.      top
283b0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
283c0 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
283d0 20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73   assert( end + s
283e0 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20  z <= top );.    
283f0 7d 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f  }.    idx = allo
28400 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
28410 20 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74   sz);.    assert
28420 28 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61  ( idx>0 );.    a
28430 73 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65  ssert( end <= ge
28440 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
28450 2b 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28  +5]) );.    if (
28460 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
28470 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
28480 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
28490 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
284a0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
284b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
284c0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
284d0 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
284e0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
284f0 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
28500 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
28510 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
28520 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
28530 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
28540 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
28550 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
28560 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
28570 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
28580 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
28590 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
285a0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
285b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
285c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
285d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
285e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
285f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
28600 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
28610 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
28620 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
28630 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
28640 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
28650 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
28660 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
28670 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
28680 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
28690 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  /.      CellInfo
286a0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c   info;.      sql
286b0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
286c0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
286d0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
286e0 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
286f0 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
28700 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
28710 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
28720 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  d );.      if( i
28730 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
28740 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
28750 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
28760 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
28770 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
28780 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28790 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
287a0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
287b0 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
287c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
287d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
287e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
287f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
28800 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
28810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28820 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
28830 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
28840 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
28850 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
28860 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
28870 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
28880 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
28890 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
288a0 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
288b0 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
288c0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
288d0 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
288e0 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
288f0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
28900 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
28910 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
28920 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
28930 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
28940 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
28950 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
28960 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
28970 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
28980 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
28990 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
289a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
289b0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
289c0 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
289d0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
289e0 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
289f0 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
28a00 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
28a10 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
28a20 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
28a30 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
28a40 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
28a50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
28a60 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
28a70 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
28a80 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
28a90 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
28aa0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
28ab0 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
28ac0 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
28ad0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
28ae0 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
28af0 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
28b00 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28b10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28b20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
28b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28b40 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28b50 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28b60 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
28b70 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
28b80 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
28b90 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
28ba0 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
28bb0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28bc0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28bd0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
28be0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
28bf0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
28c00 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
28c10 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
28c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28c30 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
28c40 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
28c50 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e  &data[hdr+5])==n
28c60 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65  Usable );..  pCe
28c70 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50  llptr = &data[pP
28c80 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
28c90 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  + nCell*2];.  ce
28ca0 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
28cb0 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
28cc0 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
28cd0 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
28ce0 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
28cf0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
28d00 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
28d10 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  r, cellbody);.  
28d20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
28d30 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c  ellbody], apCell
28d40 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a  [i], aSize[i]);.
28d50 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
28d60 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
28d70 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
28d80 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
28d90 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
28da0 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
28db0 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
28dc0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
28dd0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
28de0 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
28df0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
28e00 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
28e10 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
28e20 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
28e30 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
28e40 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
28e50 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
28e60 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
28e70 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
28e80 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
28e90 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
28ea0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
28eb0 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
28ec0 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
28ed0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
28ee0 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
28ef0 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
28f00 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
28f10 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
28f20 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
28f30 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
28f40 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
28f50 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
28f60 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
28f70 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
28f80 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
28f90 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
28fa0 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
28fb0 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
28fc0 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
28fd0 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
28fe0 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
28ff0 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
29000 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
29010 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
29020 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
29030 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
29040 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
29050 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
29060 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29070 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
29080 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
29090 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
290a0 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
290b0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
290c0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
290d0 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
290e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
290f0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
29100 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
29110 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
29120 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
29130 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
29140 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
29150 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
29160 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
29170 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
29180 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
29190 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
291a0 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
291b0 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
291c0 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
291d0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
291e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
291f0 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63  of trying balanc
29200 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
29210 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
29220 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
29230 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
29240 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
29250 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
29260 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
29270 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
29280 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
29290 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
292a0 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
292b0 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
292c0 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
292d0 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
292e0 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
292f0 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
29300 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
29310 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
29320 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
29330 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
29340 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
29350 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
29360 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
29370 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
29380 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
29390 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
293a0 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
293b0 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
293c0 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
293d0 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
293e0 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
293f0 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
29400 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
29410 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73  pSpace buffer is
29420 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
29430 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20   temporary copy 
29440 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a  of the divider.*
29450 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  * cell that will
29460 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
29470 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20  o pParent. Such 
29480 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
29490 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70  of a 4.** byte p
294a0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
294b0 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
294c0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
294d0 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f  . In other.** wo
294e0 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20  rds, at most 13 
294f0 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65  bytes. Hence the
29500 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d   pSpace buffer m
29510 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61  ust be at.** lea
29520 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73  st 13 bytes in s
29530 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
29540 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
29550 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
29560 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  t, MemPage *pPag
29570 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a  e, u8 *pSpace){.
29580 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73    BtShared *cons
29590 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70  t pBt = pPage->p
295a0 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65  Bt;    /* B-Tree
295b0 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d   Database */.  M
295c0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30  emPage *pNew = 0
295d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
295e0 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
295f0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
29600 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
29630 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Code */.  Pgno p
29640 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20  gnoNew;         
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29660 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
29670 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   pNew */..  asse
29680 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29690 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
296a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
296b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
296c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
296d0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
296e0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
296f0 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75  >nCell<=0 ) retu
29700 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29710 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
29720 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
29730 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
29740 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
29750 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
29760 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
29770 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
29780 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
29790 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
297a0 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
297b0 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
297c0 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
297d0 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
297e0 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
297f0 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
29800 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
29810 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
29820 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
29830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29840 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
29850 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
29860 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
29870 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
29880 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
29890 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
298a0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
298b0 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
298c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
298d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
298e0 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
298f0 65 29 20 29 3b 0a 0a 20 20 20 20 7a 65 72 6f 50  e) );..    zeroP
29900 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d  age(pNew, pPage-
29910 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
29920 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
29930 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
29940 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  zCell);.    pPag
29950 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
29960 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  ;.  .    /* Crea
29970 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
29980 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
29990 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
299a0 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
299b0 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
299c0 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
299d0 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
299e0 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
299f0 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
29a00 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
29a10 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
29a20 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
29a30 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
29a40 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
29a50 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
29a60 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
29a70 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
29a80 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
29a90 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
29aa0 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
29ab0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
29ac0 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
29ad0 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
29ae0 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
29af0 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
29b00 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
29b10 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
29b20 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
29b30 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
29b40 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
29b50 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
29b60 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
29b70 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
29b80 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
29b90 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
29ba0 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
29bb0 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
29bc0 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
29bd0 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
29be0 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
29bf0 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
29c00 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
29c10 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
29c20 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
29c30 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
29c40 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
29c50 28 70 53 70 61 63 65 2c 20 70 50 61 67 65 2d 3e  (pSpace, pPage->
29c60 70 67 6e 6f 29 3b 0a 20 20 20 20 70 43 65 6c 6c  pgno);.    pCell
29c70 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
29c80 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
29c90 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
29ca0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
29cb0 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
29cc0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
29cd0 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
29ce0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
29cf0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
29d00 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
29d10 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
29d20 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
29d30 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
29d40 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
29d50 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 2a  l into pParent *
29d60 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
29d70 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
29d80 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
29d90 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
29da0 61 63 65 29 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  ace), 0, 0);..  
29db0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
29dc0 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
29dd0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
29de0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
29df0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
29e00 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
29e10 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
29e20 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
29e30 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
29e40 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
29e50 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
29e60 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
29e70 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
29e80 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
29e90 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
29ea0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
29eb0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
29ec0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
29ed0 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
29ee0 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ow page..    */.
29ef0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
29f00 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
29f10 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
29f20 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41  , pgnoNew, PTRMA
29f30 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
29f40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
29f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29f60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
29f70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
29f80 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  New, 0);.      }
29f90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
29fa0 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
29fb0 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
29fc0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
29fd0 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
29fe0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
29ff0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2a000 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2a010 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ALANCE */../*.**
2a020 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2a030 64 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c  distributes Cell
2a040 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75  s on pPage and u
2a050 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e  p to NN*2 siblin
2a060 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73  gs.** of pPage s
2a070 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  o that all pages
2a080 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20   have about the 
2a090 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
2a0a0 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73  ree space..** Us
2a0b0 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67  ually NN sibling
2a0c0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2a0d0 20 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65   of pPage is use
2a0e0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
2a0f0 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f  ng,.** though mo
2a100 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  re siblings migh
2a110 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20  t come from one 
2a120 73 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73  side if pPage is
2a130 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72   the first.** or
2a140 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
2a150 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70  ts parent.  If p
2a160 50 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74  Page has fewer t
2a170 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67  han 2*NN sibling
2a180 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20  s.** (something 
2a190 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
2a1a0 61 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69  appen if pPage i
2a1b0 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
2a1c0 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f  or a .** child o
2a1d0 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c  f root) then all
2a1e0 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
2a1f0 6e 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20  ngs participate 
2a200 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2a210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
2a220 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
2a230 66 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65  f pPage might be
2a240 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2a250 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f  creased by one o
2a260 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65  r.** two in an e
2a270 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
2a280 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
2a290 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
2a2a0 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  l. The root page
2a2b0 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61  .** is special a
2a2c0 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  nd is allowed to
2a2d0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
2a2e0 2e 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a  . If pPage is .*
2a2f0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c  * the root page,
2a300 20 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20   then the depth 
2a310 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68  of the tree migh
2a320 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a  t be increased.*
2a330 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62  * or decreased b
2a340 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73  y one, as necess
2a350 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65  ary, to keep the
2a360 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20   root page from 
2a370 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c  being.** overful
2a380 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20  l or completely 
2a390 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  empty..**.** Not
2a3a0 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2a3b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a3c0 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
2a3d0 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a  Cells on pPage.*
2a3e0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
2a3f0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
2a400 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
2a410 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
2a420 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
2a430 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20  e is overfull.  
2a440 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20  Part of the job 
2a450 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
2a460 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75  is to.** make su
2a470 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72  re all Cells for
2a480 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69   pPage once agai
2a490 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e  n fit in pPage->
2a4a0 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49  aData[]..**.** I
2a4b0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2a4c0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69  balancing the si
2a4d0 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c  blings of pPage,
2a4e0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   the parent of p
2a4f0 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65  Page.** might be
2a500 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
2a510 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20   underfull.  If 
2a520 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68  that happens, th
2a530 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
2a540 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63  ** is called rec
2a550 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20  ursively on the 
2a560 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  parent..**.** If
2a570 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2a580 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
2a590 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
2a5a0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
2a5b0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
2a5c0 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
2a5d0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
2a5e0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
2a5f0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
2a600 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
2a610 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2a620 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20  nonroot(MemPage 
2a630 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 50  *pParent, int iP
2a640 61 72 65 6e 74 49 64 78 2c 20 75 38 20 2a 61 4f  arentIdx, u8 *aO
2a650 76 66 6c 53 70 61 63 65 29 7b 0a 20 20 42 74 53  vflSpace){.  BtS
2a660 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2a670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a680 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
2a690 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
2a6a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a6b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
2a6c0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2a6d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
2a6e0 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
2a6f0 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
2a700 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
2a710 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
2a720 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30  /.  int nOld = 0
2a730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2a750 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
2a760 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  /.  int nNew = 0
2a770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a780 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2a790 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
2a7a0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2a7d0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76  s */.  int nxDiv
2a7e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a7f0 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69      /* Next divi
2a800 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72  der slot in pPar
2a810 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
2a820 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a840 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2a850 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43  e */.  int leafC
2a860 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20  orrection;      
2a870 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67      /* 4 if pPag
2a880 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
2a890 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  if not */.  int 
2a8a0 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20  leafData;       
2a8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a8c0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
2a8d0 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54  eaf of a LEAFDAT
2a8e0 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  A tree */.  int 
2a8f0 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20  usableSpace;    
2a900 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2a910 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e  s in pPage beyon
2a920 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  d the header */.
2a930 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b    int pageFlags;
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a950 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65  * Value of pPage
2a960 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20  ->aData[0] */.  
2a970 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20  int subtotal;   
2a980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a990 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65  Subtotal of byte
2a9a0 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e  s in cells on on
2a9b0 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
2a9c0 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20  iSpace1 = 0;    
2a9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a9e0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
2a9f0 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20   aSpace1[] */.  
2aa00 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d  int iOvflSpace =
2aa10 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
2aa20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2aa30 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b  e of aOvflSpace[
2aa40 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
2aa50 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
2aa60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
2aa70 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
2aa80 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
2aa90 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
2aaa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
2aab0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
2aac0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
2aad0 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2aaf0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
2ab00 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
2ab10 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
2ab20 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
2ab30 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
2ab40 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
2ab50 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
2ab60 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
2ab70 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
2ab80 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
2ab90 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
2aba0 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
2abb0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
2abc0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
2abd0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
2abe0 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
2abf0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
2ac00 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
2ac10 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
2ac20 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
2ac30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
2ac40 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2ac50 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2ac60 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
2ac70 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
2ac80 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
2ac90 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2aca0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
2acb0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
2acc0 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
2acd0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2ace0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2acf0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2ad00 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
2ad10 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad30 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2ad40 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
2ad50 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
2ad60 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
2ad70 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
2ad80 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
2ad90 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
2ada0 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
2adb0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
2adc0 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
2add0 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f  iders cells befo
2ade0 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  re balance */.  
2adf0 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a  u8 *aFrom = 0;..
2ae00 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d    pBt = pParent-
2ae10 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2ae20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2ae30 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2ae40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2ae50 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2ae60 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2ae70 50 61 67 65 29 20 29 3b 0a 0a 20 20 54 52 41 43  Page) );..  TRAC
2ae80 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67  E(("BALANCE: beg
2ae90 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64  in page %d child
2aea0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   of %d\n", pPage
2aeb0 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d  ->pgno, pParent-
2aec0 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 46  >pgno));..  /* F
2aed0 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20  ind the sibling 
2aee0 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65  pages to balance
2aef0 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68  . Also locate th
2af00 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
2af10 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69  nt .  ** that di
2af20 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67  vide the sibling
2af30 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  s. An attempt is
2af40 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
2af50 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20   siblings on .  
2af60 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  ** either side o
2af70 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69  f pPage. More si
2af80 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
2af90 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
2afa0 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69  however, .  ** i
2afb0 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  f there are fewe
2afc0 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
2afd0 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
2afe0 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74  side. If pParent
2aff0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
2b000 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
2b010 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
2b020 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
2b030 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
2b040 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78  Div = iParentIdx
2b050 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44   - NN;.  if( nxD
2b060 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e  iv + NB > pParen
2b070 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2b080 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d  nxDiv = pParent-
2b090 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b  >nCell - NB + 1;
2b0a0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
2b0b0 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <0 ){.    nxDiv 
2b0c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 0;.  }.  for(i
2b0d0 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e  =0, k=nxDiv; i<N
2b0e0 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  B; i++, k++){.  
2b0f0 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d    if( k<pParent-
2b100 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2b110 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
2b120 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b  ell(pParent, k);
2b130 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2b140 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
2b150 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
2b160 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
2b170 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
2b180 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
2b190 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
2b1a0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
2b1b0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2b1c0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2b1d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2b1e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b1f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2b200 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2b210 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
2b220 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  d[i], &apOld[i])
2b230 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2b240 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2b250 6e 75 70 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b  nup;.    apCopy[
2b260 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
2b270 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
2b280 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
2b290 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
2b2a0 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
2b2b0 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
2b2c0 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
2b2d0 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2b2e0 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2b2f0 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2b300 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2b310 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2b320 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2b330 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2b340 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2b350 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2b360 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2b370 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
2b380 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
2b390 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3b0 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
2b3c0 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
2b3d0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
2b400 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69      + (ROUND8(si
2b410 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70  zeof(MemPage))+p
2b420 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42  Bt->pageSize)*NB
2b430 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20    /* aCopy */.  
2b440 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2b450 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b470 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2b480 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43      + (ISAUTOVAC
2b490 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20  UUM ? nMaxCells 
2b4a0 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  : 0);           
2b4b0 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
2b4c0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
2b4d0 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
2b4e0 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
2b4f0 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 7c 7c 20  f( apCell==0 || 
2b500 61 4f 76 66 6c 53 70 61 63 65 3d 3d 30 20 29 7b  aOvflSpace==0 ){
2b510 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b520 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
2b530 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2b540 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
2b550 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
2b560 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f  MaxCells];.  aCo
2b570 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a  py[0] = (u8*)&sz
2b580 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
2b590 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2b5a0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2b5b0 61 43 6f 70 79 5b 30 5d 29 20 29 3b 0a 20 20 66  aCopy[0]) );.  f
2b5c0 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
2b5d0 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
2b5e0 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
2b5f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
2b600 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
2b610 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
2b620 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
2b630 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20  (u8*)0) & 7)==0 
2b640 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
2b650 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
2b660 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31  */.  }.  aSpace1
2b670 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b   = &aCopy[NB-1][
2b680 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f  pBt->pageSize+RO
2b690 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
2b6a0 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  age))];.  assert
2b6b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2b6c0 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
2b6d0 29 3b 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  );.  if( ISAUTOV
2b6e0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72  ACUUM ){.    aFr
2b6f0 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42  om = &aSpace1[pB
2b700 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
2b710 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  }.  .  /*.  ** M
2b720 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2b730 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
2b740 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2b750 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
2b760 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
2b770 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b780 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
2b790 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
2b7a0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
2b7b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
2b7c0 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
2b7d0 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
2b7e0 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
2b7f0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
2b800 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
2b810 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
2b820 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
2b830 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
2b840 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2b850 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
2b860 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
2b870 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
2b880 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
2b890 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
2b8a0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
2b8b0 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
2b8c0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
2b8d0 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
2b8e0 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
2b8f0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
2b900 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
2b910 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
2b920 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2b930 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
2b940 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
2b950 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
2b960 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2b970 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
2b980 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
2b990 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
2b9a0 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
2b9b0 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
2b9c0 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
2b9d0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
2b9e0 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
2b9f0 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
2ba00 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2ba10 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
2ba20 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
2ba30 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
2ba40 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
2ba50 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
2ba60 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
2ba70 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
2ba80 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2ba90 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
2baa0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
2bab0 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
2bac0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
2bad0 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
2bae0 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
2baf0 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
2bb00 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
2bb10 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
2bb20 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
2bb30 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
2bb40 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
2bb50 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
2bb60 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
2bb70 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
2bb80 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
2bb90 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
2bba0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
2bbb0 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
2bbc0 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
2bbd0 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
2bbe0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
2bbf0 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f  Correction = apO
2bc00 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20  ld[0]->leaf*4;. 
2bc10 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c   leafData = apOl
2bc20 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20  d[0]->hasData;. 
2bc30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
2bc40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
2bc50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2bc60 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c  py[i];.    int l
2bc70 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2bc80 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2bc90 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2bca0 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2bcb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2bcc0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2bcd0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2bce0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2bcf0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2bd00 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2bd10 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2bd20 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2bd30 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2bd40 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2bd50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2bd60 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
2bd70 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b  [nCell] = (u8)i;
2bd80 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
2bd90 26 26 20 69 3c 36 20 29 3b 0a 20 20 20 20 20 20  && i<6 );.      
2bda0 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c    for(a=0; a<pOl
2bdb0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b  d->nOverflow; a+
2bdc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2bdd0 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d  ( pOld->aOvfl[a]
2bde0 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e  .pCell==apCell[n
2bdf0 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  Cell] ){.       
2be00 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
2be10 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
2be20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2be30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2be40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2be50 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2be60 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
2be70 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
2be80 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2be90 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2bea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  );.      if( lea
2beb0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2bec0 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41   /* With the LEA
2bed0 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72  FDATA flag, pPar
2bee0 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f  ent cells hold o
2bef0 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74  nly INTKEYs that
2bf00 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
2bf10 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65  duplicates of ke
2bf20 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ys on the child 
2bf30 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20  pages.  We need 
2bf40 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20  to remove.      
2bf50 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72    ** the divider
2bf60 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72   cells from pPar
2bf70 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76  ent, but the div
2bf80 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20  iders cells are 
2bf90 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
2bfa0 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d  dded to apCell[]
2bfb0 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
2bfc0 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
2bfd0 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20  child cells..   
2bfe0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2bff0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2c000 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
2c010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c020 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2c030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2c040 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2c050 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
2c060 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
2c070 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
2c080 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a  pace1[iSpace1];.
2c090 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31 20          iSpace1 
2c0a0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
2c0b0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
2c0c0 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
2c0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2c0e0 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
2c0f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
2c100 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
2c110 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
2c120 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2c130 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
2c140 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2c150 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2c160 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UUM ){.         
2c170 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
2c180 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
2c190 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2c1a0 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2c1b0 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 73   sz);.        as
2c1c0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2c1d0 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
2c1e0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
2c1f0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2c200 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65  Cell] -= (u16)le
2c210 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2c220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65        assert( ge
2c230 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70  t4byte(pTemp)==p
2c240 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20  gnoOld[i] );.   
2c250 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
2c260 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2c270 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2c280 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
2c290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c2a0 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
2c2b0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2c2c0 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
2c2d0 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20   left.          
2c2e0 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
2c2f0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
2c300 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
2c310 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
2c320 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70  , &pOld->aData[p
2c330 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  Old->hdrOffset+8
2c340 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], 4);.        }
2c350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2c360 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2c370 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
2c380 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
2c390 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
2c3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2c3b0 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
2c3c0 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
2c3d0 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
2c3e0 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
2c3f0 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
2c400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c410 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  }.        nCell+
2c420 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
2c430 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2c440 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
2c450 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
2c460 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
2c470 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
2c480 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
2c490 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
2c4a0 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
2c4b0 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2c4c0 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
2c4d0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
2c4e0 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
2c4f0 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
2c500 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
2c510 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
2c520 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
2c530 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
2c540 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
2c550 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
2c560 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
2c570 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
2c580 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
2c590 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
2c5a0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
2c5b0 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
2c5c0 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
2c5d0 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
2c5e0 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
2c5f0 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
2c600 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2c610 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
2c620 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
2c630 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
2c640 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
2c650 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
2c660 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
2c670 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
2c680 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2c690 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
2c6a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2c6b0 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2c6c0 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
2c6d0 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
2c6e0 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
2c6f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
2c700 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
2c710 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
2c720 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
2c730 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2c740 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
2c750 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
2c760 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
2c770 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
2c780 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
2c790 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
2c7a0 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
2c7b0 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
2c7c0 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
2c7d0 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
2c7e0 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
2c7f0 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
2c800 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
2c810 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
2c820 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
2c830 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
2c840 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
2c850 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
2c860 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
2c870 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
2c880 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
2c890 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
2c8a0 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
2c8b0 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
2c8c0 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
2c8d0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
2c8e0 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
2c8f0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2c900 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
2c910 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
2c920 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
2c930 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
2c940 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
2c950 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
2c960 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
2c970 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
2c980 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
2c990 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
2c9a0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
2c9b0 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
2c9c0 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
2c9d0 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
2c9e0 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
2c9f0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2ca00 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
2ca10 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
2ca20 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
2ca30 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
2ca40 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
2ca50 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
2ca60 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
2ca70 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
2ca80 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
2ca90 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
2caa0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
2cab0 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
2cac0 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
2cad0 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
2cae0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
2caf0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb10 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
2cb20 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
2cb30 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
2cb40 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
2cb50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2cb60 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
2cb70 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
2cb80 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
2cb90 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
2cba0 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
2cbb0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
2cbc0 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
2cbd0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
2cbe0 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
2cbf0 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
2cc00 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
2cc10 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
2cc20 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
2cc30 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
2cc40 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
2cc50 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
2cc60 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
2cc70 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
2cc80 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
2cc90 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
2cca0 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
2ccb0 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
2ccc0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
2ccd0 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
2cce0 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
2ccf0 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
2cd00 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
2cd10 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
2cd20 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
2cd30 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65  [0])>0) or pPage
2cd40 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75   is.  ** a virtu
2cd50 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
2cd60 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2cd70 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
2cd80 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
2cd90 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
2cda0 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
2cdb0 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
2cdc0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
2cdd0 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
2cde0 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
2cdf0 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
2ce00 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
2ce10 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
2ce20 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
2ce30 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
2ce40 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
2ce50 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
2ce60 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3e 31 20  pOld[0]->pgno>1 
2ce70 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d  );.  pageFlags =
2ce80 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
2ce90 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
2cea0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
2ceb0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
2cec0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
2ced0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
2cee0 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
2cef0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
2cf00 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b  i] = pgnoOld[i];
2cf10 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  .      apOld[i] 
2cf20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2cf30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2cf40 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2cf50 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
2cf60 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2cf70 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2cf80 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nup;.    }else{.
2cf90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e        assert( i>
2cfa0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2cfb0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2cfc0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
2cfd0 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e  gnoNew[i], pgnoN
2cfe0 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20  ew[i-1], 0);.   
2cff0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d000 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d010 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
2d020 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
2d030 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  New++;.    }.  }
2d040 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
2d050 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
2d060 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
2d070 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
2d080 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
2d090 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  d ){.    rc = fr
2d0a0 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  eePage(apOld[i])
2d0b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2d0c0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2d0d0 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
2d0e0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2d0f0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
2d100 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
2d110 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
2d120 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
2d130 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
2d140 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
2d150 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
2d160 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
2d170 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
2d180 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
2d190 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
2d1a0 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
2d1b0 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
2d1c0 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
2d1d0 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
2d1e0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
2d1f0 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
2d200 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
2d210 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
2d220 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
2d230 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
2d240 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
2d250 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
2d260 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
2d270 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
2d280 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
2d290 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
2d2a0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
2d2b0 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
2d2c0 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
2d2d0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
2d2e0 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
2d2f0 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
2d300 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
2d310 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
2d320 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
2d330 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
2d340 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
2d350 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
2d360 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  i];.    int minI
2d370 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
2d380 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
2d390 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65        if( pgnoNe
2d3a0 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d  w[j]<(unsigned)m
2d3b0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
2d3c0 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
2d3d0 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
2d3e0 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
2d3f0 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
2d400 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
2d410 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2d420 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67  pT;.      t = pg
2d430 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  noNew[i];.      
2d440 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
2d450 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
2d460 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b  = pgnoNew[minI];
2d470 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
2d480 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
2d490 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e       pgnoNew[min
2d4a0 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70  I] = t;.      ap
2d4b0 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
2d4c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
2d4d0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
2d4e0 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a  : %d %d %d  new:
2d4f0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
2d500 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
2d510 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f  %d)\n",.    pgno
2d520 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c  Old[0], .    nOl
2d530 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31  d>=2 ? pgnoOld[1
2d540 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  ] : 0,.    nOld>
2d550 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20  =3 ? pgnoOld[2] 
2d560 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77  : 0,.    pgnoNew
2d570 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  [0], szNew[0],. 
2d580 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e     nNew>=2 ? pgn
2d590 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[1] : 0, nNe
2d5a0 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
2d5b0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
2d5c0 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20   ? pgnoNew[2] : 
2d5d0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
2d5e0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
2d5f0 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77  New>=4 ? pgnoNew
2d600 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  [3] : 0, nNew>=4
2d610 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
2d620 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70  .    nNew>=5 ? p
2d630 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e  gnoNew[4] : 0, n
2d640 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
2d650 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20  ] : 0));..  /*. 
2d660 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
2d670 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
2d680 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
2d690 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
2d6a0 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
2d6b0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
2d6c0 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
2d6d0 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
2d6e0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
2d6f0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
2d700 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
2d710 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
2d720 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
2d730 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
2d740 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
2d750 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
2d760 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
2d770 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69  >pgno==pgnoNew[i
2d780 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ] );.    zeroPag
2d790 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
2d7a0 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
2d7b0 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
2d7c0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
2d7d0 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
2d7e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2d7f0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
2d800 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
2d810 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
2d820 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
2d830 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
2d840 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2d850 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2d860 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2d870 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2d880 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74  entries.    ** t
2d890 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  hat point to the
2d8a0 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
2d8b0 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20  ere rearranged. 
2d8c0 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65  These can be: le
2d8d0 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72  ft.    ** childr
2d8e0 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65  en of cells, the
2d8f0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
2d900 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65  the page, or ove
2d910 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
2d920 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
2d930 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   cells..    */. 
2d940 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2d950 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  UUM ){.      for
2d960 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69  (k=j; k<cntNew[i
2d970 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; k++){.       
2d980 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43   assert( k<nMaxC
2d990 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
2d9a0 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78  if( aFrom[k]==0x
2d9b0 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72  FF || apCopy[aFr
2d9c0 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e  om[k]]->pgno!=pN
2d9d0 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ew->pgno ){.    
2d9e0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2d9f0 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b  pPutOvfl(pNew, k
2da00 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  -j);.          i
2da10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2da20 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74 69   && leafCorrecti
2da30 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  on==0 ){.       
2da40 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2da50 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
2da60 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54  e(apCell[k]), PT
2da70 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
2da80 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2da90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2daa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dac0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2dad0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20  anup;.          
2dae0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2daf0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a    }.    }..    j
2db00 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
2db10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
2db20 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
2db30 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
2db40 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
2db50 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
2db60 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
2db70 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
2db80 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
2db90 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e   */.    if( i<nN
2dba0 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20  ew-1 && j<nCell 
2dbb0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
2dbc0 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
2dbd0 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
2dbe0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
2dbf0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
2dc00 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
2dc10 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
2dc20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
2dc30 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2dc40 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
2dc50 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
2dc60 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
2dc70 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
2dc80 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2dc90 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
2dca0 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
2dcb0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2dcc0 43 55 55 4d 20 0a 20 20 20 20 20 20 20 20 20 26  CUUM .         &
2dcd0 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46  & (aFrom[j]==0xF
2dce0 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f  F || apCopy[aFro
2dcf0 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65  m[j]]->pgno!=pNe
2dd00 77 2d 3e 70 67 6e 6f 29 0a 20 20 20 20 20 20 20  w->pgno).       
2dd10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2dd20 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2dd30 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  , get4byte(pCell
2dd40 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2dd50 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
2dd60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2dd70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dd80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2dd90 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2dda0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ddb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2ddc0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
2ddd0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2dde0 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
2ddf0 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
2de00 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
2de10 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
2de20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
2de30 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
2de40 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
2de50 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
2de60 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
2de70 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
2de80 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
2de90 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
2dea0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
2deb0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
2dec0 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
2ded0 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
2dee0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2def0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
2df00 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
2df10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2df20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2df30 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
2df40 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2df50 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2df60 0a 09 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61  ..sz = 4 + putVa
2df70 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
2df80 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20  info.nKey);.    
2df90 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
2dfa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dfb0 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
2dfc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
2dfd0 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
2dfe0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
2dff0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
2e000 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
2e010 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
2e020 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
2e030 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
2e040 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
2e050 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
2e060 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
2e070 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
2e080 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
2e090 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
2e0a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
2e0b0 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
2e0c0 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
2e0d0 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
2e0e0 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
2e0f0 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
2e100 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
2e110 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
2e120 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
2e130 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
2e140 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
2e150 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
2e160 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
2e170 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
2e180 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
2e190 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
2e1a0 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
2e1b0 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
2e1c0 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
2e1d0 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
2e1e0 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
2e1f0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
2e200 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
2e210 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
2e220 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
2e230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e240 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
2e250 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
2e260 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
2e270 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
2e280 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
2e290 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
2e2a0 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
2e2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
2e2c0 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
2e2d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
2e2e0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
2e2f0 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
2e300 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70  t( iOvflSpace<=p
2e310 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
2e320 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2e330 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
2e340 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
2e350 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20   pTemp, 4);.    
2e360 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e370 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
2e380 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2e390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e3a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e3b0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2e3c0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 70 75 74  ge) );.      put
2e3d0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2e3e0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e  owCell(pParent,n
2e3f0 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e  xDiv), pNew->pgn
2e400 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  o);..      /* If
2e410 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2e420 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2e430 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
2e440 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
2e450 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
2e460 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2e470 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
2e480 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2e490 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
2e4a0 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
2e4b0 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
2e4c0 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
2e4d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2e4e0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26   ISAUTOVACUUM &&
2e4f0 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20   !leafData ){.  
2e500 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2e510 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74  pPutOvfl(pParent
2e520 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20  , nxDiv);.      
2e530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2e550 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2e560 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
2e570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
2e580 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
2e590 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
2e5a0 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
2e5b0 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74  -map entry for t
2e5c0 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
2e5d0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  age. */.    if( 
2e5e0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2e5f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2e600 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
2e610 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2e620 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2e630 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2e640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e650 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2e660 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2e670 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2e680 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c   assert( j==nCel
2e690 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  l );.  assert( n
2e6a0 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Old>0 );.  asser
2e6b0 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69  t( nNew>0 );.  i
2e6c0 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20  f( (pageFlags & 
2e6d0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a  PTF_LEAF)==0 ){.
2e6e0 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d      u8 *zChild =
2e6f0 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
2e700 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20  ->aData[8];.    
2e710 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
2e720 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
2e730 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20   zChild, 4);.   
2e740 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2e750 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
2e760 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2e770 65 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c  et4byte(zChild),
2e780 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61   PTRMAP_BTREE, a
2e790 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
2e7a0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2e7b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e7c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2e7d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2e7e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2e7f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e800 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e810 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2e820 67 65 29 20 29 3b 0a 20 20 69 66 28 20 6e 78 44  ge) );.  if( nxD
2e830 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  iv==pParent->nCe
2e840 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  ll+pParent->nOve
2e850 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20  rflow ){.    /* 
2e860 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
2e870 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ng is the right-
2e880 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
2e890 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74  arent */.    put
2e8a0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2e8b0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2e8c0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2e8d0 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
2e8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
2e8f0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2e900 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63 68  g is the left ch
2e910 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  ild of the first
2e920 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65 6e   entry in pParen
2e930 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  t.    ** past th
2e940 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69 76  e right-most div
2e950 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ider entry */.  
2e960 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2e970 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72  verflowCell(pPar
2e980 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e  ent, nxDiv), pgn
2e990 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20  oNew[nNew-1]);. 
2e9a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61   }..  /*.  ** Ba
2e9b0 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
2e9c0 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
2e9d0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
2e9e0 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
2e9f0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2ea00 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2ea10 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
2ea20 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
2ea30 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
2ea40 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
2ea50 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
2ea60 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2ea70 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ea80 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
2ea90 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  );.  sqlite3Scra
2eaa0 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
2eab0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20  .  apCell = 0;. 
2eac0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2ead0 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20  : finished with 
2eae0 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25  %d: old=%d new=%
2eaf0 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20  d cells=%d\n",. 
2eb00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
2eb10 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77  pgno, nOld, nNew
2eb20 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 0a 20 20  , nCell));.  .  
2eb30 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
2eb40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2eb50 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
2eb60 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
2eb70 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
2eb80 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
2eb90 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2eba0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
2ebb0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
2ebc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
2ebd0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
2ebe0 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
2ebf0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2ec00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2ec10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2ec20 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
2ec30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
2ec40 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
2ec50 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
2ec60 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2ec70 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
2ec80 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
2ec90 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
2eca0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2ecb0 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
2ecc0 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
2ecd0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
2ece0 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
2ecf0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
2ed00 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
2ed10 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
2ed20 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
2ed30 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
2ed40 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
2ed50 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
2ed60 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
2ed70 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
2ed80 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
2ed90 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
2eda0 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
2edb0 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
2edc0 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
2edd0 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
2ede0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
2edf0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
2ee00 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b  * MemPage.aOvfl[
2ee10 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
2ee20 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
2ee30 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
2ee40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
2ee50 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
2ee60 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 73  tialized using s
2ee70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2ee80 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
2ee90 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
2eea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2eeb0 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
2eec0 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
2eed0 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
2eee0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
2eef0 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
2ef00 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
2ef10 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
2ef20 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
2ef30 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
2ef40 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
2ef50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
2ef60 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65  pyNodeContent(Me
2ef70 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65  mPage *pFrom, Me
2ef80 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20 20 42  mPage *pTo){.  B
2ef90 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
2efa0 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
2efb0 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  ;.  u8 * const a
2efc0 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44  From = pFrom->aD
2efd0 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ata;.  u8 * cons
2efe0 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
2eff0 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20  ta;.  int const 
2f000 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
2f010 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
2f020 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
2f030 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
2f040 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
2f050 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2f060 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74 61 3b  OK;.  int iData;
2f070 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ..  assert( pFro
2f080 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  m->isInit );.  a
2f090 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
2f0a0 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
2f0b0 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
2f0c0 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
2f0d0 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62  r+5])<=pBt->usab
2f0e0 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a 20  leSize );..  /* 
2f0f0 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
2f100 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
2f110 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
2f120 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 69  page pTo. */.  i
2f130 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28  Data = get2byte(
2f140 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
2f150 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  5]);.  memcpy(&a
2f160 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f  To[iData], &aFro
2f170 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75  m[iData], pBt->u
2f180 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29  sableSize-iData)
2f190 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b  ;.  memcpy(&aTo[
2f1a0 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b  iToHdr], &aFrom[
2f1b0 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d  iFromHdr], pFrom
2f1c0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
2f1d0 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pFrom->nCell);.
2f1e0 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69  .  /* Reinitiali
2f1f0 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
2f200 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
2f210 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
2f220 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 6d  structure.  ** m
2f230 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74  atch the new dat
2f240 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a  a. The initializ
2f250 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61  ation of pTo "ca
2f260 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20 74  nnot" fail, as t
2f270 68 65 0a 20 20 2a 2a 20 64 61 74 61 20 63 6f 70  he.  ** data cop
2f280 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20 69  ied from pFrom i
2f290 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76 61  s known to be va
2f2a0 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d 3e  lid.  */.  pTo->
2f2b0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54 45  isInit = 0;.  TE
2f2c0 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20 73 71  STONLY(rc = ) sq
2f2d0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2f2e0 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65 72  ge(pTo);.  asser
2f2f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2f300 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
2f310 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2f320 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2f330 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2f340 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 2a  -map entries.  *
2f350 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
2f360 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
2f370 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
2f380 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
2f390 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20 69  nters to. */.  i
2f3a0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2f3b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
2f3c0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
2f3d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f3e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2f3f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f400 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  ed on the root p
2f410 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
2f420 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
2f430 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
2f440 20 63 65 6c 6c 73 2e 20 54 68 69 73 20 69 73 20   cells. This is 
2f450 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
2f460 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a  o make the tree.
2f470 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20  ** shallower by 
2f480 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  one level..*/.st
2f490 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2f4a0 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61  _shallower(MemPa
2f4b0 67 65 20 2a 70 52 6f 6f 74 29 7b 0a 20 20 2f 2a  ge *pRoot){.  /*
2f4c0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
2f4d0 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20  s empty but has 
2f4e0 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e  one child.  Tran
2f4f0 73 66 65 72 20 74 68 65 0a 20 20 2a 2a 20 69 6e  sfer the.  ** in
2f500 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2f510 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e  hat one child in
2f520 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
2f530 20 69 66 20 69 74 20 0a 20 20 2a 2a 20 77 69 6c   if it .  ** wil
2f540 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65 64  l fit.  This red
2f550 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20 6f  uces the depth o
2f560 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e  f the tree by on
2f570 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
2f580 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2f590 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
2f5a0 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
2f5b0 61 62 6c 65 20 74 68 61 6e 0a 20 20 2a 2a 20 69  able than.  ** i
2f5c0 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
2f5d0 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
2f5e0 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
2f5f0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2f600 67 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61  g.  ** of the da
2f610 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20  tabase fle), so 
2f620 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  it might not be 
2f630 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  able to hold all
2f640 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e   of the .  ** in
2f650 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e  formation curren
2f660 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  tly contained in
2f670 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20   the child.  If 
2f680 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 2a  this is the .  *
2f690 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20  * case, then do 
2f6a0 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73  not do the trans
2f6b0 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65  fer.  Leave page
2f6c0 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a   1 empty except.
2f6d0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67    ** for the rig
2f6e0 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ht-pointer to th
2f6f0 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  e child page.  T
2f700 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65  he child page be
2f710 63 6f 6d 65 73 0a 20 20 2a 2a 20 74 68 65 20 76  comes.  ** the v
2f720 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74  irtual root of t
2f730 68 65 20 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  he tree..  */.  
2f740 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2f750 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2f760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f770 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2f780 6e 74 20 63 6f 6e 73 74 20 68 64 72 20 3d 20 70  nt const hdr = p
2f790 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Root->hdrOffset;
2f7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2f7b0 73 65 74 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  set of root page
2f7c0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 4d 65 6d   header */.  Mem
2f7d0 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2f800 63 68 69 6c 64 20 6f 66 20 70 52 6f 6f 74 20 2a  child of pRoot *
2f810 2f 0a 20 20 50 67 6e 6f 20 63 6f 6e 73 74 20 70  /.  Pgno const p
2f820 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2f830 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
2f840 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
2f850 65 74 2b 38 5d 29 3b 0a 20 20 0a 20 20 61 73 73  et+8]);.  .  ass
2f860 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c  ert( pRoot->nCel
2f870 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2f880 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f890 68 65 6c 64 28 70 52 6f 6f 74 2d 3e 70 42 74 2d  held(pRoot->pBt-
2f8a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2f8b0 65 72 74 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  ert( !pRoot->lea
2f8c0 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  f );.  assert( p
2f8d0 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20  gnoChild>0 );.  
2f8e0 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2f8f0 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  d<=pagerPagecoun
2f900 74 28 70 52 6f 6f 74 2d 3e 70 42 74 29 20 29 3b  t(pRoot->pBt) );
2f910 0a 20 20 61 73 73 65 72 74 28 20 68 64 72 3d 3d  .  assert( hdr==
2f920 30 20 7c 7c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  0 || pRoot->pgno
2f930 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 72 63 20 3d  ==1 );.  .  rc =
2f940 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f950 50 61 67 65 28 70 52 6f 6f 74 2d 3e 70 42 74 2c  Page(pRoot->pBt,
2f960 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68   pgnoChild, &pCh
2f970 69 6c 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ild, 0);.  if( r
2f980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2f990 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e      if( pChild->
2f9a0 6e 46 72 65 65 3e 3d 68 64 72 20 29 7b 0a 20 20  nFree>=hdr ){.  
2f9b0 20 20 20 20 69 66 28 20 68 64 72 20 29 7b 0a 20      if( hdr ){. 
2f9c0 20 20 20 20 20 20 20 72 63 20 3d 20 64 65 66 72         rc = defr
2f9d0 61 67 6d 65 6e 74 50 61 67 65 28 70 43 68 69 6c  agmentPage(pChil
2f9e0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
2f9f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fa00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2fa10 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  c = copyNodeCont
2fa20 65 6e 74 28 70 43 68 69 6c 64 2c 20 70 52 6f 6f  ent(pChild, pRoo
2fa30 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2fa40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fa50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2fa60 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 43 68  c = freePage(pCh
2fa70 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ild);.      }.  
2fa80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2fa90 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20  * The child has 
2faa0 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2fab0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f   that will fit o
2fac0 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20  n the root..    
2fad0 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
2fae0 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
2faf0 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
2fb00 2a 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  */.      TRACE((
2fb10 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
2fb20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  %d will not fit 
2fb30 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  on page 1\n", pC
2fb40 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2fb50 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
2fb60 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2fb70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2fb80 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
2fb90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2fba0 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70   when the root p
2fbb0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20  age of a b-tree 
2fbc0 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20  structure is.** 
2fbd0 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e  overfull (has on
2fbe0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
2fbf0 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a  ow pages)..**.**
2fc00 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   A new child pag
2fc10 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  e is allocated a
2fc20 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
2fc30 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
2fc40 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63  oot.** page, inc
2fc50 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  luding overflow 
2fc60 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65  cells, are copie
2fc70 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  d into the child
2fc80 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  . The root.** pa
2fc90 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77  ge is then overw
2fca0 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69  ritten to make i
2fcb0 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  t an empty page 
2fcc0 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63  with the right-c
2fcd0 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  hild .** pointer
2fce0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2fcf0 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   new page..**.**
2fd00 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
2fd10 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  g, all pointer-m
2fd20 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
2fd30 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
2fd40 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  s .** that the n
2fd50 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f  ew child-page no
2fd60 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  w contains point
2fd70 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74  ers to are updat
2fd80 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79  ed. The.** entry
2fd90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2fda0 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  o the new right-
2fdb0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
2fdc0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
2fdd0 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  e is also update
2fde0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
2fdf0 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64  essful, *ppChild
2fe00 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61   is set to conta
2fe10 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
2fe20 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20  o the child .** 
2fe30 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  page and SQLITE_
2fe40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2fe50 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2fe60 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69   caller is requi
2fe70 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72  red.** to call r
2fe80 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20  eleasePage() on 
2fe90 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79  *ppChild exactly
2fea0 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72   once. If an err
2feb0 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e  or occurs,.** an
2fec0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2fed0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43  eturned and *ppC
2fee0 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30  hild is set to 0
2fef0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ff00 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
2ff10 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d  emPage *pRoot, M
2ff20 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64  emPage **ppChild
2ff30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
2ff60 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
2ff70 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
2ff80 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b  age *pChild = 0;
2ff90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2ffa0 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
2ffb0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
2ffc0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ffe0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2fff0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
30000 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
30010 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70   *pBt = pRoot->p
30020 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54  Bt;    /* The BT
30030 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ree */..  assert
30040 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  ( pRoot->nOverfl
30050 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ow>0 );.  assert
30060 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30070 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
30080 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70   );..  /* Make p
30090 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70  Root, the root p
300a0 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
300b0 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c  e, writable. All
300c0 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a  ocate a new .  *
300d0 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  * page that will
300e0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
300f0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
30100 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63  Page. Copy the c
30110 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
30120 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  the node stored 
30130 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68  on pRoot into th
30140 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
30150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ..  */.  if( SQL
30160 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
30170 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30180 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 29  pRoot->pDbPage))
30190 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
301a0 21 3d 28 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  !=(rc = allocate
301b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70  BtreePage(pBt,&p
301c0 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64  Child,&pgnoChild
301d0 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 29  ,pRoot->pgno,0))
301e0 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
301f0 21 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65  !=(rc = copyNode
30200 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70  Content(pRoot, p
30210 43 68 69 6c 64 29 29 0a 20 20 20 7c 7c 20 28 49  Child)).   || (I
30220 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 0a  SAUTOVACUUM && .
30230 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
30240 21 3d 28 72 63 20 3d 20 70 74 72 6d 61 70 50 75  !=(rc = ptrmapPu
30250 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  t(pBt, pgnoChild
30260 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
30270 70 52 6f 6f 74 2d 3e 70 67 6e 6f 29 29 29 0a 20  pRoot->pgno))). 
30280 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64   ){.    *ppChild
30290 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
302a0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
302b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
302c0 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
302d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
302e0 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
302f0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
30300 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
30310 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
30320 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
30330 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
30340 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65  Cell==pRoot->nCe
30350 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  ll );..  TRACE((
30360 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
30370 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
30380 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  ", pRoot->pgno, 
30390 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
303a0 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f  .  /* Copy the o
303b0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72  verflow cells fr
303c0 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69  om pRoot to pChi
303d0 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  ld */.  memcpy(p
303e0 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52  Child->aOvfl, pR
303f0 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  oot->aOvfl, pRoo
30400 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  t->nOverflow*siz
30410 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  eof(pRoot->aOvfl
30420 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
30430 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f  >nOverflow = pRo
30440 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a  ot->nOverflow;..
30450 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f    /* Zero the co
30460 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e  ntents of pRoot.
30470 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43   Then install pC
30480 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68  hild as the righ
30490 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65  t-child. */.  ze
304a0 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43  roPage(pRoot, pC
304b0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
304c0 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
304d0 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  ut4byte(&pRoot->
304e0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
304f0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
30500 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69  hild);..  *ppChi
30510 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72  ld = pChild;.  r
30520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
30540 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
30550 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
30560 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
30570 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
30580 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
30590 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
305a0 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
305b0 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
305c0 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
305d0 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
305e0 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
305f0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
30600 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
30610 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20  tine. Balancing 
30620 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a  routines are:.**
30630 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75  .**   balance_qu
30640 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  ick().**   balan
30650 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 0a 2a  ce_shallower().*
30660 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
30670 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
30680 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2a 0a 2a  e_nonroot().**.*
30690 2a 20 49 66 20 62 75 69 6c 74 20 77 69 74 68 20  * If built with 
306a0 53 51 4c 49 54 45 5f 44 45 42 55 47 2c 20 70 43  SQLITE_DEBUG, pC
306b0 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
306c0 64 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  d is set to true
306d0 20 69 66 20 0a 2a 2a 20 62 61 6c 61 6e 63 65 5f   if .** balance_
306e0 73 68 61 6c 6c 6f 77 65 72 28 29 2c 20 62 61 6c  shallower(), bal
306f0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6f 72  ance_deeper() or
30700 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
30710 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
30720 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 73   If none of thes
30730 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
30740 69 6e 76 6f 6b 65 64 2c 20 70 43 75 72 2d 3e 70  invoked, pCur->p
30750 61 67 65 73 53 68 75 66 66 6c 65 64 20 69 73 20  agesShuffled is 
30760 6c 65 66 74 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69  left.** unmodifi
30770 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
30780 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73  t balance(BtCurs
30790 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
307a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
307b0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69  .  const int nMi
307c0 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75  n = pCur->pBt->u
307d0 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20  sableSize * 2 / 
307e0 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65  3;.  u8 aBalance
307f0 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a  QuickSpace[13];.
30800 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
30810 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ..  TESTONLY( in
30820 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f  t balance_quick_
30830 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20  called = 0 );.  
30840 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61  TESTONLY( int ba
30850 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c  lance_deeper_cal
30860 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f  led = 0 );..  do
30870 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   {.    int iPage
30880 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
30890 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
308a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
308b0 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69  e[iPage];..    i
308c0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( iPage==0 ){. 
308d0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
308e0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
308f0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74       /* The root
30900 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
30910 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  ree is overfull.
30920 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61   In this case ca
30930 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ll the.        *
30940 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  * balance_deeper
30950 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
30960 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
30970 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
30980 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  age.        ** a
30990 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72  nd copy the curr
309a0 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
309b0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  the root-page to
309c0 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20   it. The.       
309d0 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69   ** next iterati
309e0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
309f0 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74  p will balance t
30a00 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  he child page.. 
30a10 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
30a20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
30a30 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65  nce_deeper_calle
30a40 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d++)==0 );.     
30a50 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
30a60 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70  deeper(pPage, &p
30a70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b  Cur->apPage[1]);
30a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
30a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30aa0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50          pCur->iP
30ab0 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  age = 1;.       
30ac0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30     pCur->aiIdx[0
30ad0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
30ae0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20   pCur->aiIdx[1] 
30af0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
30b00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
30b10 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  age[1]->nOverflo
30b20 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w );.        }. 
30b30 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
30b40 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66   pCur->pagesShuf
30b50 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20  fled = 1 );.    
30b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30b70 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
30b80 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
30b90 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 49 66  is now empty. If
30ba0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 69   the root-page i
30bb0 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
30bc0 20 61 6c 73 6f 20 61 20 6c 65 61 66 20 70 61 67   also a leaf pag
30bd0 65 2c 20 69 74 20 77 69 6c 6c 20 68 61 76 65 20  e, it will have 
30be0 61 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  a single child p
30bf0 61 67 65 2e 20 43 61 6c 6c 20 0a 20 20 20 20 20  age. Call .     
30c00 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 73 68     ** balance_sh
30c10 61 6c 6c 6f 77 65 72 20 74 6f 20 61 74 74 65 6d  allower to attem
30c20 70 74 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  pt to copy the c
30c30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 73  ontents of the s
30c40 69 6e 67 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  ingle.        **
30c50 20 63 68 69 6c 64 2d 70 61 67 65 20 69 6e 74 6f   child-page into
30c60 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 28   the root page (
30c70 74 68 69 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  this may not be 
30c80 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 0a  possible if the.
30c90 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6f 74 20          ** root 
30ca0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 29 2e  page is page 1).
30cb0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
30cc0 20 20 20 20 2a 2a 20 57 68 65 74 68 65 72 20 6f      ** Whether o
30cd0 72 20 6e 6f 74 20 74 68 69 73 20 69 73 20 70 6f  r not this is po
30ce0 73 73 69 62 6c 65 20 2c 20 74 68 65 20 74 72 65  ssible , the tre
30cf0 65 20 69 73 20 6e 6f 77 20 62 61 6c 61 6e 63 65  e is now balance
30d00 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  d. .        ** T
30d10 68 65 72 65 66 6f 72 65 20 69 73 20 6e 6f 20 6e  herefore is no n
30d20 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
30d30 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 2e 0a 20 20   the do-loop..  
30d40 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
30d50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
30d60 6c 6c 3d 3d 30 20 26 26 20 21 70 50 61 67 65 2d  ll==0 && !pPage-
30d70 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
30d80 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
30d90 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29  shallower(pPage)
30da0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 56 41 5f  ;.          VVA_
30db0 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
30dc0 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
30dd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30de0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
30df0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
30e00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
30e10 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
30e20 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20  ree<=nMin ){.   
30e30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
30e40 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  lse{.      MemPa
30e50 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65  ge * const pPare
30e60 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  nt = pCur->apPag
30e70 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20  e[iPage-1];.    
30e80 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78    int const iIdx
30e90 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
30ea0 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20  Page-1];..      
30eb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30ec0 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
30ed0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30ef0 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
30f00 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
30f10 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
30f20 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
30f30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
30f40 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
30f50 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
30f60 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
30f70 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
30f80 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
30f90 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
30fa0 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
30fb0 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
30fc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30fd0 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
30fe0 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
30ff0 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
31000 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
31010 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
31020 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
31030 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
31040 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
31050 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
31060 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
31070 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
31080 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
31090 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
310a0 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
310b0 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
310c0 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
310d0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
310e0 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
310f0 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
31100 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
31110 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
31120 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
31130 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
31140 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
31150 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
31160 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
31170 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
31180 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
31190 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
311a0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
311b0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
311c0 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
311d0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
311e0 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
311f0 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
31200 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
31210 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
31220 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
31230 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
31240 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
31250 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
31260 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
31270 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
31280 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
31290 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
312a0 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
312b0 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
312c0 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
312d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
312e0 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
312f0 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
31300 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
31310 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
31320 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
31330 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
31340 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
31350 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
31360 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
31370 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
31380 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
31390 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
313a0 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
313b0 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
313c0 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
313d0 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
313e0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
313f0 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
31400 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
31410 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
31420 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
31430 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
31440 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
31450 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
31460 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
31470 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
31480 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
31490 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
314a0 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
314b0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
314c0 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
314d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
314e0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
314f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
31500 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
31510 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
31520 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
31530 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
31540 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
31550 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
31560 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
31570 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
31580 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
31590 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
315a0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
315b0 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
315c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
315d0 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
315e0 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
315f0 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
31600 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
31610 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
31620 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
31630 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
31640 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
31650 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
31660 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
31670 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
31680 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
31690 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
316a0 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
316b0 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
316c0 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
316d0 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
316e0 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
316f0 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
31700 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
31710 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
31720 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
31730 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
31740 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
31750 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
31760 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
31770 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
31780 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
31790 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
317a0 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
317b0 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
317c0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
317d0 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
317e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
317f0 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
31800 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
31810 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
31820 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31830 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
31840 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
31850 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
31860 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
31870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31880 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
31890 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
318a0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
318b0 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
318c0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
318d0 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
318e0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
318f0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
31900 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
31910 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
31920 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
31930 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
31940 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
31950 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
31960 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
31970 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
31980 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
31990 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
319a0 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
319b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
319c0 09 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65  .  /* The pSpace
319d0 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20   buffer will be 
319e0 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20  freed after the 
319f0 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 09 20 20  next call to..  
31a00 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
31a10 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
31a20 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
31a30 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
31a40 68 65 76 65 72 0a 09 20 20 2a 2a 20 63 6f 6d 65  hever..  ** come
31a50 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  s first. */.    
31a60 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53        pFree = pS
31a70 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 20 20  pace;.          
31a80 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
31a90 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
31aa0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  1 );.        }. 
31ab0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
31ac0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
31ad0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
31ae0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
31af0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
31b00 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
31b10 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
31b20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31b30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
31b40 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
31b50 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
31b60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
31b70 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
31b80 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
31b90 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
31ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
31bb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
31bc0 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
31bd0 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
31be0 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
31bf0 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
31c00 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65  ose cursors were
31c10 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
31c20 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66  lag==0 in a diff
31c30 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73  erent.** databas
31c40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20  e connection (a 
31c50 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
31c60 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20  ion that shares 
31c70 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63  the pager.** cac
31c80 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72  he with the curr
31c90 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20  ent connection) 
31ca0 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63  and that other c
31cb0 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  onnection .** is
31cc0 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64   not in the Read
31cd0 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61  Uncommmitted sta
31ce0 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  te, then this ro
31cf0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a  utine returns .*
31d00 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  * SQLITE_LOCKED.
31d10 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
31d20 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77  s cursors with w
31d30 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72  rFlag==0, cursor
31d40 73 20 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63  s with .** isInc
31d50 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61  rblobHandle==1 a
31d60 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72  re also consider
31d70 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f 72  ed 'read' cursor
31d80 73 20 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63  s because.** inc
31d90 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
31da0 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66  rsors are used f
31db0 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
31dc0 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a  and writing..**.
31dd0 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74  ** When pgnoRoot
31de0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
31df0 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74  e of an intkey t
31e00 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  able, this funct
31e10 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ion is also.** r
31e20 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69  esponsible for i
31e30 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72  nvalidating incr
31e40 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
31e50 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61  sors when the ta
31e60 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68  ble row.** on wh
31e70 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65  ich they are ope
31e80 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f  ned is deleted o
31e90 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73  r modified. Curs
31ea0 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
31eb0 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
31ec0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
31ed0 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
31ee0 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c   1) When BtreeCl
31ef0 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61  earTable() is ca
31f00 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
31f10 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f  ly delete the co
31f20 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f  ntents.**      o
31f30 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65  f a B-Tree table
31f40 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
31f50 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61  t to zero and pa
31f60 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
31f70 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20  .**      set to 
31f80 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69  non-zero. In thi
31f90 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65  s case all incre
31fa0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
31fb0 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20  ors open.**     
31fc0 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f   on the table ro
31fd0 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74  oted at pgnoRoot
31fe0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
31ff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
32000 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c  n BtreeInsert(),
32010 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
32020 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29  r BtreePutData()
32030 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a   is called to .*
32040 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20  *      modify a 
32050 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e  table row via an
32060 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
32070 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
32080 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  to the .**      
32090 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65  write cursor use
320a0 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69  d to do the modi
320b0 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72  fication and par
320c0 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73  ameter iRow is s
320d0 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  et.**      to th
320e0 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64  e integer row id
320f0 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65   of the B-Tree e
32100 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66  ntry being modif
32110 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20  ied. Unless.**  
32120 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20      pExclude is 
32130 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d  itself an increm
32140 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
32150 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72  r, then all incr
32160 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20  emental.**      
32170 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
32180 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66  n on row iRow of
32190 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20   the B-Tree are 
321a0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
321b0 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20  **   3) If both 
321c0 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f  pExclude and iRo
321d0 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  w are set to zer
321e0 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61  o, no incrementa
321f0 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20  l blob .**      
32200 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
32210 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  lidated..*/.stat
32220 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52  ic int checkForR
32230 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20  eadConflicts(.  
32240 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
32250 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
32260 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
32270 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20  check */.  Pgno 
32280 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20  pgnoRoot,       
32290 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
322a0 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
322b0 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
322c0 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64  tCursor *pExclud
322d0 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  e,     /* Ignore
322e0 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
322f0 20 20 69 36 34 20 69 52 6f 77 20 20 20 20 20 20    i64 iRow      
32300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32310 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
32320 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
32330 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
32340 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
32350 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
32360 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
32370 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  = pBtree->db;.  
32380 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
32390 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
323a0 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28  Btree) );.  for(
323b0 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
323c0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
323d0 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c      if( p==pExcl
323e0 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ude ) continue;.
323f0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
32400 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20  oot!=pgnoRoot ) 
32410 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
32420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
32430 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70  CRBLOB.    if( p
32440 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
32450 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20  le && ( .       
32460 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20    (!pExclude && 
32470 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28  iRow).      || (
32480 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78  pExclude && !pEx
32490 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f  clude->isIncrblo
324a0 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e  bHandle && p->in
324b0 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20  fo.nKey==iRow). 
324c0 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e     )){.      p->
324d0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
324e0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23  INVALID;.    }.#
324f0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
32500 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
32510 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65  VALID ) continue
32520 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
32530 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20  lag==0 .#ifndef 
32540 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
32550 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e  BLOB.     || p->
32560 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
32570 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20  .#endif.    ){. 
32580 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
32590 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
325a0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61 73 73  e->db;.      ass
325b0 65 72 74 28 64 62 4f 74 68 65 72 29 3b 0a 20 20  ert(dbOther);.  
325c0 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 21      if( dbOther!
325d0 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d  =db && (dbOther-
325e0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
325f0 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
32600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
32610 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
32620 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f 74  Blocked(db, dbOt
32630 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  her);.        re
32640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
32650 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
32660 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32670 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
32680 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
32690 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
326a0 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
326b0 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
326c0 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
326d0 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
326e0 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
326f0 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
32700 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
32710 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
32720 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
32730 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
32740 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
32750 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
32760 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
32770 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
32780 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
32790 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
327a0 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
327b0 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
327c0 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
327d0 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
327e0 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
327f0 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
32800 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
32810 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
32820 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
32830 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
32840 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
32850 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  en a successful 
32860 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
32870 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e3BtreeMoveto() 
32880 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70  to seek cursor p
32890 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b  Cur to (pKey, nK
328a0 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a  ey) has already.
328b0 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65  ** been performe
328c0 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73  d. seekResult is
328d0 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75   the search resu
328e0 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e  lt returned (a n
328f0 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65  egative.** numbe
32900 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  r if pCur points
32910 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
32920 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
32930 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20  n (pKey, nKey), 
32940 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65  or.** a positive
32950 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20 70   value if pCur p
32960 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79  oints at an etry
32970 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
32980 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20  than .** (pKey, 
32990 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  nKey)). .**.** I
329a0 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
329b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
329c0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75   then cursor pCu
329d0 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  r may point to a
329e0 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72 20  ny .** entry or 
329f0 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61  to no entry at a
32a00 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
32a10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
32a20 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68  as to seek.** th
32a30 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20  e cursor before 
32a40 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20  the new key can 
32a50 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
32a60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
32a70 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
32a80 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
32a90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
32aa0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
32ab0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
32ac0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
32ad0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
32ae0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
32af0 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
32b00 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
32b10 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
32b20 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
32b30 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
32b40 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
32b50 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
32b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b70 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
32b80 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
32b90 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
32ba0 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20  nt appendBias,  
32bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32bc0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
32bd0 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
32be0 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  d */.  int seekR
32bf0 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
32c00 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
32c10 6f 66 20 70 72 69 6f 72 20 73 71 6c 69 74 65 33  of prior sqlite3
32c20 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 63 61  BtreeMoveto() ca
32c30 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ll */.){.  int r
32c40 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73  c;.  int loc = s
32c50 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74  eekResult;.  int
32c60 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64   szNew;.  int id
32c70 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
32c80 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  age;.  Btree *p 
32c90 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
32ca0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32cb0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
32cc0 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65  gned char *oldCe
32cd0 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll;.  unsigned c
32ce0 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30  har *newCell = 0
32cf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
32d00 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
32d10 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
32d20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
32d30 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
32d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
32d50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
32d60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
32d70 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d  wrFlag );.  rc =
32d80 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
32d90 66 6c 69 63 74 73 28 70 43 75 72 2d 3e 70 42 74  flicts(pCur->pBt
32da0 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
32db0 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29  oot, pCur, nKey)
32dc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 20 20  ;.  if( rc ){   
32dd0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 2f            .    /
32de0 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
32df0 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
32e00 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
32e10 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32e20 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
32e30 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72  EDCACHE );.    r
32e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
32e50 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
32e60 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
32e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
32e80 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20  r->skip;.  }..  
32e90 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
32ea0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
32eb0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
32ec0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20  on this table.. 
32ed0 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65   **.  ** In some
32ee0 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
32ef0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
32f00 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
32f10 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
32f20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
32f30 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
32f40 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
32f50 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
32f60 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
32f70 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
32f80 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
32f90 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
32fa0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
32fb0 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
32fc0 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
32fd0 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
32fe0 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
32ff0 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
33000 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
33010 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
33020 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 71   In this case sq
33030 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
33040 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20  () recognizes.  
33050 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
33060 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68  or is already wh
33070 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ere it needs to 
33080 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77  be and returns w
33090 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e  ithout.  ** doin
330a0 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61  g any work. To a
330b0 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74  void thwarting t
330c0 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
330d0 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ns, it is import
330e0 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  ant.  ** not to 
330f0 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72  clear the cursor
33100 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   here..  */.  if
33110 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  (.    SQLITE_OK!
33120 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
33130 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
33140 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
33150 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20  ) || (!loc &&.  
33160 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
33170 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
33180 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
33190 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
331a0 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29 7b  as, &loc)).  )){
331b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
331c0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
331d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
331e0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
331f0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
33200 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a  y || nKey>=0 );.
33210 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
33220 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
33230 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
33240 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
33250 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
33260 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
33270 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
33280 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
33290 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
332a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
332b0 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
332c0 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
332d0 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
332e0 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
332f0 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
33300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33310 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
33320 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
33330 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
33340 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
33350 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
33360 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
33370 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
33380 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
33390 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
333a0 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
333b0 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
333c0 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
333d0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
333e0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
333f0 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
33400 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
33410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
33420 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
33430 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d  (pBt) );.  idx =
33440 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
33450 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
33460 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f   loc==0 && CURSO
33470 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
33480 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36  State ){.    u16
33490 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
334a0 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
334b0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
334c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
334d0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
334e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
334f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
33500 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
33510 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
33520 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
33530 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
33540 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
33550 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
33560 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
33570 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
33580 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
33590 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
335a0 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
335b0 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
335c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
335d0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
335e0 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c     rc = dropCell
335f0 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f  (pPage, idx, szO
33600 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ld);.    if( rc!
33610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20  =SQLITE_OK ) {. 
33620 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
33630 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  sert;.    }.  }e
33640 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26  lse if( loc<0 &&
33650 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
33660 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
33670 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
33680 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
33690 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
336a0 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e];.  }else{.   
336b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
336c0 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
336d0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
336e0 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c  age, idx, newCel
336f0 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b  l, szNew, 0, 0);
33700 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
33710 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
33720 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50  e->nCell>0 || pP
33730 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
33740 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20   );..  /* If no 
33750 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
33760 64 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20  d and pPage has 
33770 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
33780 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29  , call balance()
33790 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74   .  ** to redist
337a0 72 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73  ribute the cells
337b0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65   within the tree
337c0 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28  . Since balance(
337d0 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20  ) may move.  ** 
337e0 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f  the cursor, zero
337f0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e   the BtCursor.in
33800 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43  fo.nSize and BtC
33810 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a  ursor.validNKey.
33820 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a    ** variables..
33830 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f    **.  ** Previo
33840 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  us versions of S
33850 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76  QLite called mov
33860 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76  eToRoot() to mov
33870 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a  e the cursor.  *
33880 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f  * back to the ro
33890 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e  ot page as balan
338a0 63 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76  ce() used to inv
338b0 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74  alidate the cont
338c0 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43  ents.  ** of BtC
338d0 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61  ursor.apPage[] a
338e0 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  nd BtCursor.aiId
338f0 78 5b 5d 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  x[]. This is no 
33900 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
33910 2c 0a 20 20 2a 2a 20 61 73 20 62 61 6c 61 6e 63  ,.  ** as balanc
33920 65 28 29 20 61 6c 77 61 79 73 20 6c 65 61 76 65  e() always leave
33930 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  s the cursor poi
33940 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
33950 20 65 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   entry..  **.  *
33960 2a 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62  * There is a sub
33970 74 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e  tle but importan
33980 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68  t optimization h
33990 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e  ere too. When in
339a0 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c  serting.  ** mul
339b0 74 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e  tiple records in
339c0 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74  to an intkey b-t
339d0 72 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67  ree using a sing
339e0 6c 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61  le cursor (as ca
339f0 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68  n.  ** happen wh
33a00 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  ile processing a
33a10 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e  n "INSERT INTO .
33a20 2e 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65  .. SELECT" state
33a30 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69  ment), it.  ** i
33a40 73 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74  s advantageous t
33a50 6f 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73  o leave the curs
33a60 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  or pointing to t
33a70 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
33a80 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
33a90 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66   if possible. If
33aa0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
33ab0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
33ac0 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e  the last.  ** en
33ad0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
33ae0 2c 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72  , and the next r
33af0 6f 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20  ow inserted has 
33b00 61 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20  an integer key. 
33b10 20 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20   ** larger than 
33b20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73  the largest exis
33b30 74 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20  ting key, it is 
33b40 70 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65  possible to inse
33b50 72 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20  rt the.  ** row 
33b60 77 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20  without seeking 
33b70 74 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73  the cursor. This
33b80 20 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65   can be a big pe
33b90 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e  rformance boost.
33ba0 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e  .  */.  pCur->in
33bb0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
33bc0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
33bd0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
33be0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
33bf0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  e->nOverflow ){.
33c00 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
33c10 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
33c20 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20  alance(pCur);.. 
33c30 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20     /* Must make 
33c40 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69  sure nOverflow i
33c50 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20  s reset to zero 
33c60 65 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61  even if the bala
33c70 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69  nce().    ** fai
33c80 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64 61  ls.  Internal da
33c90 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ta structure cor
33ca0 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  ruption will res
33cb0 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20 2a  ult otherwise. *
33cc0 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
33cd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
33ce0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
33cf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
33d00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
33d10 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
33d20 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e  ow==0 );..end_in
33d30 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
33d40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
33d50 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
33d60 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
33d70 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
33d80 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
33d90 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
33da0 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
33db0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
33dc0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
33dd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
33de0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
33df0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
33e00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
33e10 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e 73 69   int idx;.  unsi
33e20 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
33e30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
33e40 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
33e50 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
33e60 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
33e70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
33e80 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
33e90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
33ea0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
33eb0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
33ec0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
33ed0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
33ee0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
33ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
33f00 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
33f10 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
33f20 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
33f30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
33f40 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20  Cur->skip;.  }. 
33f50 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
33f60 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
33f70 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
33f80 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
33f90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20   SQLITE_ERROR;  
33fa0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  /* The cursor is
33fb0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f   not pointing to
33fc0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
33fd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
33fe0 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63 20  >wrFlag );.  rc 
33ff0 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
34000 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d  nflicts(p, pCur-
34010 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c  >pgnoRoot, pCur,
34020 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
34030 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
34040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
34050 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20   The table pCur 
34060 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20  points to has a 
34070 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
34080 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
34090 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
340a0 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65  DCACHE );.    re
340b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
340c0 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  /* Restore the c
340d0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
340e0 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20  sition (a no-op 
340f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
34100 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55   not in .  ** CU
34110 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
34120 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65   state) and save
34130 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
34140 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
34150 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ors .  ** open o
34160 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
34170 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69  . Then call sqli
34180 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
34190 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a  on the page.  **
341a0 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20   that the entry 
341b0 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
341c0 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  from..  */.  if(
341d0 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74   .    (rc = rest
341e0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
341f0 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
34200 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
34210 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
34220 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
34230 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
34240 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
34250 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
34260 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
34270 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34280 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
34290 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
342a0 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61 76  ts page and leav
342b0 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e 67  e pCell pointing
342c0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   to the.  ** dat
342d0 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c 6c  a. The clearCell
342e0 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61 6e  () call frees an
342f0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
34300 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
34310 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
34320 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66 20  The cell itself 
34330 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74 2e  is still intact.
34340 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43  .  */.  idx = pC
34350 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
34360 69 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c 6c 20  iPage];.  pCell 
34370 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
34380 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70  , idx);.  if( !p
34390 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
343a0 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
343b0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
343c0 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43   }.  rc = clearC
343d0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
343e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
343f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34400 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
34410 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a  >leaf ){.    /*.
34420 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79      ** The entry
34430 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
34440 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61   delete is not a
34450 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64   leaf so if we d
34460 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20  o not.    ** do 
34470 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c  something we wil
34480 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f  l leave a hole o
34490 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61  n an internal pa
344a0 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61  ge..    ** We ha
344b0 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68  ve to fill the h
344c0 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e  ole by moving in
344d0 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c   a cell from a l
344e0 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a  eaf.  The.    **
344f0 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72   next Cell after
34500 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64   the one to be d
34510 65 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e  eleted is guaran
34520 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e  teed to exist an
34530 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61  d.    ** to be a
34540 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20   leaf so we can 
34550 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  use it..    */. 
34560 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66     BtCursor leaf
34570 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  Cur;.    MemPage
34580 20 2a 70 4c 65 61 66 50 61 67 65 20 3d 20 30 3b   *pLeafPage = 0;
34590 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
345a0 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
345b0 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
345c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
345d0 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
345e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
345f0 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
34600 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
34610 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
34620 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
34630 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34640 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
34650 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
34660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34670 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
34680 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c   leafCur.aiIdx[l
34690 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30  eafCur.iPage]==0
346a0 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 61 66 50   );.      pLeafP
346b0 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70  age = leafCur.ap
346c0 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61  Page[leafCur.iPa
346d0 67 65 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ge];.      rc = 
346e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
346f0 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62  e(pLeafPage->pDb
34700 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
34710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34720 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
34730 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
34740 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 31 36  d = 0;.      u16
34750 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54   szNext;.      T
34760 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
34770 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
34780 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
34790 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
347a0 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
347b0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
347c0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
347d0 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29  LeafPage->pgno))
347e0 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  ;.      dropCell
347f0 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65 6c  (pPage, idx, cel
34800 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
34810 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70  pCell));.      p
34820 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Next = findCell(
34830 70 4c 65 61 66 50 61 67 65 2c 20 30 29 3b 0a 20  pLeafPage, 0);. 
34840 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63 65       szNext = ce
34850 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61 66 50  llSizePtr(pLeafP
34860 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20  age, pNext);.   
34870 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
34880 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a  LL_SIZE(pBt)>=sz
34890 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20  Next+4 );.      
348a0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
348b0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65  e(pBt);.      te
348c0 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  mpCell = pBt->pT
348d0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69  mpSpace;.      i
348e0 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29  f( tempCell==0 )
348f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
34900 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
34910 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
34920 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34930 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73          rc = ins
34940 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
34950 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e  dx, pNext-4, szN
34960 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c  ext+4, tempCell,
34970 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20   0);.      }... 
34980 20 20 20 20 20 2f 2a 20 54 68 65 20 22 69 66 22       /* The "if"
34990 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68   statement in th
349a0 65 20 6e 65 78 74 20 63 6f 64 65 20 62 6c 6f 63  e next code bloc
349b0 6b 20 69 73 20 63 72 69 74 69 63 61 6c 2e 20 20  k is critical.  
349c0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 6c 69  The.      ** sli
349d0 67 68 74 65 73 74 20 65 72 72 6f 72 20 69 6e 20  ghtest error in 
349e0 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 20 77  that statement w
349f0 6f 75 6c 64 20 61 6c 6c 6f 77 20 53 51 4c 69 74  ould allow SQLit
34a00 65 20 74 6f 20 6f 70 65 72 61 74 65 0a 20 20 20  e to operate.   
34a10 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20     ** correctly 
34a20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 69 6d 65  most of the time
34a30 20 62 75 74 20 70 72 6f 64 75 63 65 20 76 65 72   but produce ver
34a40 79 20 72 61 72 65 20 66 61 69 6c 75 72 65 73 2e  y rare failures.
34a50 20 20 54 6f 0a 20 20 20 20 20 20 2a 2a 20 67 75    To.      ** gu
34a60 61 72 64 20 61 67 61 69 6e 73 74 20 74 68 69 73  ard against this
34a70 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
34a80 6d 61 63 72 6f 73 20 68 65 6c 70 20 74 6f 20 76  macros help to v
34a90 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 20  erify that.     
34aa0 20 2a 2a 20 74 68 65 20 22 69 66 22 20 73 74 61   ** the "if" sta
34ab0 74 65 6d 65 6e 74 20 69 73 20 77 65 6c 6c 20 74  tement is well t
34ac0 65 73 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ested..      */.
34ad0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34ae0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34af0 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
34b00 72 65 65 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  ree<pBt->usableS
34b10 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20 20  ize*2/3 .       
34b20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
34b30 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
34b40 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75 73  szNext > pBt->us
34b50 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a  ableSize*2/3 );.
34b60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
34b70 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34b80 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
34b90 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ree==pBt->usable
34ba0 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20 20  Size*2/3 .      
34bb0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c             && pL
34bc0 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32  eafPage->nFree+2
34bd0 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e 75  +szNext > pBt->u
34be0 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
34bf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
34c00 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
34c10 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
34c20 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
34c30 65 53 69 7a 65 2a 32 2f 33 2b 31 20 0a 20 20 20  eSize*2/3+1 .   
34c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
34c50 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
34c60 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
34c70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
34c80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
34c90 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
34ca0 66 6c 6f 77 3e 30 20 26 26 20 70 50 61 67 65 2d  flow>0 && pPage-
34cb0 3e 6e 46 72 65 65 3c 3d 70 42 74 2d 3e 75 73 61  >nFree<=pBt->usa
34cc0 62 6c 65 53 69 7a 65 2a 32 2f 33 0a 20 20 20 20  bleSize*2/3.    
34cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
34ce0 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
34cf0 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
34d00 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
34d10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
34d20 65 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65 72  e( (pPage->nOver
34d30 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67 65  flow>0 || (pPage
34d40 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e 75  ->nFree > pBt->u
34d50 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29 0a  sableSize*2/3)).
34d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d70 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
34d80 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3d 3d  Free+2+szNext ==
34d90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34da0 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20 20 20 20 20  *2/3 );...      
34db0 69 66 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76 65  if( (pPage->nOve
34dc0 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61 67  rflow>0 || (pPag
34dd0 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d 3e  e->nFree > pBt->
34de0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 29  usableSize*2/3))
34df0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 28 70   &&.          (p
34e00 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
34e10 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e  2+szNext > pBt->
34e20 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 0a  usableSize*2/3).
34e30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
34e40 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
34e50 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68 65 20  is taken if the 
34e60 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
34e70 20 6e 6f 77 20 65 69 74 68 65 72 20 6f 76 65 72   now either over
34e80 66 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 20 20  flowing.        
34e90 2a 2a 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 20  ** or underfull 
34ea0 61 6e 64 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  and the leaf nod
34eb0 65 20 77 69 6c 6c 20 62 65 20 75 6e 64 65 72 66  e will be underf
34ec0 75 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6a 75  ull after the ju
34ed0 73 74 20 63 65 6c 6c 20 0a 20 20 20 20 20 20 20  st cell .       
34ee0 20 2a 2a 20 63 6f 70 69 65 64 20 74 6f 20 74 68   ** copied to th
34ef0 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
34f00 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
34f10 69 74 2e 20 54 68 69 73 20 69 73 20 61 20 73 70  it. This is a sp
34f20 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  ecial.        **
34f30 20 63 61 73 65 20 62 65 63 61 75 73 65 20 74 68   case because th
34f40 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  e call to balanc
34f50 65 28 29 20 74 6f 20 63 6f 72 72 65 63 74 20 74  e() to correct t
34f60 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
34f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
34f80 63 68 61 6e 67 65 20 74 68 65 20 74 72 65 65 20  change the tree 
34f90 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 69 6e  structure and in
34fa0 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e  validate the con
34fb0 74 65 6e 74 73 20 6f 66 0a 20 20 20 20 20 20 20  tents of.       
34fc0 20 2a 2a 20 74 68 65 20 6c 65 61 66 43 75 72 2e   ** the leafCur.
34fd0 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
34fe0 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72  fCur.aiIdx[] arr
34ff0 61 79 73 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  ays, which will 
35000 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  be.        ** us
35010 65 64 20 62 79 20 74 68 65 20 62 61 6c 61 6e 63  ed by the balanc
35020 65 28 29 20 72 65 71 75 69 72 65 64 20 74 6f 20  e() required to 
35030 63 6f 72 72 65 63 74 20 74 68 65 20 75 6e 64 65  correct the unde
35040 72 66 75 6c 6c 20 6c 65 61 66 0a 20 20 20 20 20  rfull leaf.     
35050 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20 20 20     ** node..    
35060 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
35070 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  * The formula us
35080 65 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  ed in the expres
35090 73 69 6f 6e 20 61 62 6f 76 65 20 61 72 65 20 62  sion above are b
350a0 61 73 65 64 20 6f 6e 20 66 61 63 65 74 73 20 6f  ased on facets o
350b0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
350c0 20 53 51 4c 69 74 65 20 66 69 6c 65 2d 66 6f 72   SQLite file-for
350d0 6d 61 74 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  mat that do not 
350e0 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65  change over time
350f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
35100 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
35110 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74  Page->nFree==pBt
35120 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
35130 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  +1 );.        te
35140 73 74 63 61 73 65 28 20 70 4c 65 61 66 50 61 67  stcase( pLeafPag
35150 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
35160 74 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t==pBt->usableSi
35170 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20  ze*2/3+1 );.    
35180 20 20 20 20 6c 65 61 66 43 75 72 73 6f 72 49 6e      leafCursorIn
35190 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  valid = 1;.     
351a0 20 7d 20 20 20 20 20 20 20 20 0a 0a 20 20 20 20   }        ..    
351b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
351c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
351d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
351e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
351f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
35200 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
35210 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
35220 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 2c  ell(pPage, idx),
35230 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
35240 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70       VVA_ONLY( p
35250 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
35260 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  ed = 0 );.      
35270 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
35280 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Cur);.      }.. 
35290 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
352a0 49 54 45 5f 4f 4b 20 26 26 20 6c 65 61 66 43 75  ITE_OK && leafCu
352b0 72 73 6f 72 49 6e 76 61 6c 69 64 20 29 7b 0a 20  rsorInvalid ){. 
352c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
352d0 61 66 2d 6e 6f 64 65 20 69 73 20 6e 6f 77 20 75  af-node is now u
352e0 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 73 6f 20  nderfull and so 
352f0 74 68 65 20 74 72 65 65 20 6e 65 65 64 73 20 74  the tree needs t
35300 6f 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  o be .        **
35310 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 48 6f 77   rebalanced. How
35320 65 76 65 72 2c 20 74 68 65 20 62 61 6c 61 6e 63  ever, the balanc
35330 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  e() operation on
35340 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
35350 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 20 61 62        ** node ab
35360 6f 76 65 20 6d 61 79 20 68 61 76 65 20 6d 6f 64  ove may have mod
35370 69 66 69 65 64 20 74 68 65 20 73 74 72 75 63 74  ified the struct
35380 75 72 65 20 6f 66 20 74 68 65 20 42 2d 54 72 65  ure of the B-Tre
35390 65 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  e and.        **
353a0 20 73 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   so the current 
353b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6c 65 61 66  contents of leaf
353c0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
353d0 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
353e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  .        ** may 
353f0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a  not be trusted..
35400 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
35410 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20     ** It is not 
35420 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f 70 79  possible to copy
35430 20 74 68 65 20 61 6e 63 65 73 74 72 79 20 66 72   the ancestry fr
35440 6f 6d 20 70 43 75 72 2c 20 61 73 20 74 68 65 20  om pCur, as the 
35450 73 61 6d 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  same.        ** 
35460 62 61 6c 61 6e 63 65 28 29 20 63 61 6c 6c 20 68  balance() call h
35470 61 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 74  as invalidated t
35480 68 65 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  he pCur->apPage[
35490 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 0a 20 20  ] and aiIdx[].  
354a0 20 20 20 20 20 20 2a 2a 20 61 72 72 61 79 73 2e        ** arrays.
354b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
354c0 20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c       ** The call
354d0 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 50 6f   to saveCursorPo
354e0 73 69 74 69 6f 6e 28 29 20 62 65 6c 6f 77 20 69  sition() below i
354f0 6e 74 65 72 6e 61 6c 6c 79 20 73 61 76 65 73 20  nternally saves 
35500 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
35510 6b 65 79 20 74 68 61 74 20 6c 65 61 66 43 75 72  key that leafCur
35520 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
35530 69 6e 74 69 6e 67 20 74 6f 2e 20 43 75 72 72 65  inting to. Curre
35540 6e 74 6c 79 2c 20 74 68 65 72 65 0a 20 20 20 20  ntly, there.    
35550 20 20 20 20 2a 2a 20 61 72 65 20 74 77 6f 20 63      ** are two c
35560 6f 70 69 65 73 20 6f 66 20 74 68 61 74 20 6b 65  opies of that ke
35570 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 2d 20  y in the tree - 
35580 6f 6e 65 20 68 65 72 65 20 6f 6e 20 74 68 65 20  one here on the 
35590 6c 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  leaf.        ** 
355a0 70 61 67 65 20 61 6e 64 20 6f 6e 65 20 6f 6e 20  page and one on 
355b0 73 6f 6d 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  some internal no
355c0 64 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 20  de in the tree. 
355d0 54 68 65 20 63 6f 70 79 20 6f 6e 0a 20 20 20 20  The copy on.    
355e0 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 20      ** the leaf 
355f0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 74  node is always t
35600 68 65 20 6e 65 78 74 20 6b 65 79 20 69 6e 20 74  he next key in t
35610 72 65 65 2d 6f 72 64 65 72 20 61 66 74 65 72 20  ree-order after 
35620 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
35630 63 6f 70 79 20 6f 6e 20 74 68 65 20 69 6e 74 65  copy on the inte
35640 72 6e 61 6c 20 6e 6f 64 65 2e 20 53 6f 2c 20 74  rnal node. So, t
35650 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
35660 65 33 42 74 72 65 65 4e 65 78 74 28 29 0a 20 20  e3BtreeNext().  
35670 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 72        ** calls r
35680 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
35690 74 69 6f 6e 28 29 20 74 6f 20 70 6f 69 6e 74 20  tion() to point 
356a0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
356b0 65 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 2a  e copy.        *
356c0 2a 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  * stored on the 
356d0 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2c 20 74  internal node, t
356e0 68 65 6e 20 61 64 76 61 6e 63 65 73 20 74 6f 20  hen advances to 
356f0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 0a  the next entry,.
35700 20 20 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68          ** which
35710 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74   happens to be t
35720 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b  he copy of the k
35730 65 79 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  ey on the intern
35740 61 6c 20 6e 6f 64 65 2e 0a 20 20 20 20 20 20 20  al node..       
35750 20 2a 2a 20 4e 65 74 20 65 66 66 65 63 74 3a 20   ** Net effect: 
35760 6c 65 61 66 43 75 72 20 69 73 20 70 6f 69 6e 74  leafCur is point
35770 69 6e 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ing back to the 
35780 64 75 70 6c 69 63 61 74 65 20 63 65 6c 6c 0a 20  duplicate cell. 
35790 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6e         ** that n
357a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 6f 76  eeds to be remov
357b0 65 64 2c 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ed, and the leaf
357c0 43 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  Cur.apPage[] and
357d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 65 61 66  .        ** leaf
357e0 43 75 72 2e 61 69 49 64 78 5b 5d 20 61 72 72 61  Cur.aiIdx[] arra
357f0 79 73 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a  ys are correct..
35800 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35810 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 50 67 6e     VVA_ONLY( Pgn
35820 6f 20 6c 65 61 66 50 67 6e 6f 20 3d 20 70 4c 65  o leafPgno = pLe
35830 61 66 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a  afPage->pgno );.
35840 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76          rc = sav
35850 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
35860 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 20  &leafCur);.     
35870 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35880 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
358a0 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
358b0 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
358c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
358d0 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43  LeafPage = leafC
358e0 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75  ur.apPage[leafCu
358f0 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  r.iPage];.      
35900 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
35910 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 4c 65 61 66  LITE_OK || pLeaf
35920 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 6c 65 61 66  Page->pgno==leaf
35930 50 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20  Pgno );.        
35940 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35950 54 45 5f 4f 4b 20 7c 7c 20 6c 65 61 66 43 75 72  TE_OK || leafCur
35960 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69  .aiIdx[leafCur.i
35970 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  Page]==0 );.    
35980 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 53    }..      if( S
35990 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 0a 20 20 20  QLITE_OK==rc.   
359a0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
359b0 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ==(rc = sqlite3P
359c0 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50  agerWrite(pLeafP
359d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 0a  age->pDbPage)) .
359e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
359f0 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50   dropCell(pLeafP
35a00 61 67 65 2c 20 30 2c 20 73 7a 4e 65 78 74 29 3b  age, 0, szNext);
35a10 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
35a20 59 28 20 6c 65 61 66 43 75 72 2e 70 61 67 65 73  Y( leafCur.pages
35a30 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a  Shuffled = 0 );.
35a40 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
35a50 61 6e 63 65 28 26 6c 65 61 66 43 75 72 29 3b 0a  ance(&leafCur);.
35a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35a70 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
35a80 64 20 7c 7c 20 21 6c 65 61 66 43 75 72 2e 70 61  d || !leafCur.pa
35a90 67 65 73 53 68 75 66 66 6c 65 64 0a 20 20 20 20  gesShuffled.    
35aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
35ac0 7c 20 21 70 43 75 72 2d 3e 70 61 67 65 73 53 68  | !pCur->pagesSh
35ad0 75 66 66 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  uffled );.      
35ae0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
35af0 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
35b00 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66 43  empCursor(&leafC
35b10 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
35b20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
35b30 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
35b40 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
35b50 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ",.       pCur->
35b60 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d  pgnoRoot, pPage-
35b70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20  >pgno));.    rc 
35b80 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
35b90 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  , idx, cellSizeP
35ba0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
35bb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
35bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35bd0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
35be0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
35bf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
35c10 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
35c20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35c30 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
35c40 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
35c50 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
35c60 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
35c70 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
35c80 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
35c90 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
35ca0 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
35cb0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
35cc0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
35cd0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
35ce0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
35cf0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
35d00 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
35d10 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
35d20 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
35d30 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
35d40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
35d50 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
35d60 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
35d70 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
35d80 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
35d90 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
35da0 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
35db0 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
35dc0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
35dd0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
35de0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
35df0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
35e00 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
35e10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
35e20 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
35e30 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
35e40 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
35e50 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
35e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
35e70 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
35e80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
35e90 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
35ea0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
35eb0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
35ec0 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
35ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
35ee0 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
35ef0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
35f00 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
35f10 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
35f20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
35f30 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
35f40 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
35f50 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
35f60 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
35f70 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
35f80 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
35f90 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
35fa0 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
35fb0 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
35fc0 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
35fd0 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
35fe0 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
35ff0 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
36000 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
36010 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
36020 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
36030 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
36040 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
36050 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
36060 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
36070 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
36080 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
36090 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
360a0 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
360b0 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
360c0 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
360d0 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
360e0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
360f0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
36100 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
36110 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
36120 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
36130 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
36140 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
36150 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
36160 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
36170 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
36180 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
36190 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
361a0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
361b0 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
361c0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
361d0 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
361e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
361f0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
36200 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52   BTREE_LARGEST_R
36210 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e 6f 52  OOT_PAGE, &pgnoR
36220 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  oot);.    if( rc
36230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36240 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36250 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52 6f      }.    pgnoRo
36260 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ot++;..    /* Th
36270 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20  e new root-page 
36280 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63  may not be alloc
36290 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74 65  ated on a pointe
362a0 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20 74  r-map page, or t
362b0 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e  he.    ** PENDIN
362c0 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20 20  G_BYTE page..   
362d0 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
362e0 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f  gnoRoot==PTRMAP_
362f0 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e 6f  PAGENO(pBt, pgno
36300 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  Root) ||.       
36310 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49   pgnoRoot==PENDI
36320 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36330 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 52  ) ){.      pgnoR
36340 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  oot++;.    }.   
36350 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f 6f   assert( pgnoRoo
36360 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  t>=3 );..    /* 
36370 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65 2e  Allocate a page.
36380 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
36390 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65 73  urrently resides
363a0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69 6c   at pgnoRoot wil
363b0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76 65  l.    ** be move
363c0 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  d to the allocat
363d0 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73 20  ed page (unless 
363e0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
363f0 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20 2a  ge happens.    *
36400 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20 70  * to reside at p
36410 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f  gnoRoot)..    */
36420 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36430 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36440 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70 67   &pPageMove, &pg
36450 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f 74  noMove, pgnoRoot
36460 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
36470 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36480 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36490 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
364a0 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f  gnoMove!=pgnoRoo
364b0 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 67  t ){.      /* pg
364c0 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70 61  noRoot is the pa
364d0 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ge that will be 
364e0 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  used for the roo
364f0 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20 20  t-page of.      
36500 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
36510 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65 72   (assuming an er
36520 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63 75  ror did not occu
36530 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65 0a  r). But we were.
36540 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
36550 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66 20  ed pgnoMove. If 
36560 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20 69  required (i.e. i
36570 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 6c  f it was not all
36580 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ocated.      ** 
36590 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68 65  by extending the
365a0 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72 72   file), the curr
365b0 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73 69  ent page at posi
365c0 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20 20  tion pgnoMove.  
365d0 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64      ** is alread
365e0 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20 20  y journaled..   
365f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65     */.      u8 e
36600 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Type;.      Pgno
36610 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
36620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
36630 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20 20  ageMove);..     
36640 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67   /* Move the pag
36650 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20 70  e currently at p
36660 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d  gnoRoot to pgnoM
36670 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ove. */.      rc
36680 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
36690 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
366a0 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29  Root, &pRoot, 0)
366b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
366c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
366d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
366e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
366f0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
36700 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54 79  , pgnoRoot, &eTy
36710 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
36720 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36730 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70 65  LITE_OK || eType
36740 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
36750 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
36760 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
36770 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
36780 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
36790 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
367a0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
367b0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
367c0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
367d0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
367e0 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
367f0 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
36800 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
36810 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
36820 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
36830 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ove, 0);.      r
36840 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
36850 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
36860 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
36870 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
36880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
368a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
368b0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
368c0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
368d0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
368e0 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
368f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
36910 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36920 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
36930 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
36940 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
36950 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36970 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
36980 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
36990 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
369a0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
369b0 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
369c0 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
369d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
369e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
369f0 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
36a00 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
36a10 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
36a20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
36a30 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
36a40 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
36a50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36a60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
36a70 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
36a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36a90 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
36aa0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
36ab0 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
36ac0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36ad0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
36ae0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
36af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36b00 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
36b10 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36b20 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
36b30 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
36b40 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
36b50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36b60 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
36b70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
36b80 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
36b90 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
36ba0 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
36bb0 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
36bc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
36bd0 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
36be0 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
36bf0 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
36c00 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
36c10 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
36c20 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
36c30 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
36c40 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
36c50 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
36c60 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
36c70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
36c80 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
36c90 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
36ca0 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
36cb0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
36cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36cd0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
36ce0 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
36cf0 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
36d00 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
36d10 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
36d20 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
36d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
36d40 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
36d50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
36d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
36d70 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
36d80 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
36d90 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
36da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
36db0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
36dc0 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ar */.  int free
36dd0 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
36de0 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
36df0 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
36e00 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
36e10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
36e20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
36e30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
36e40 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
36e50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36e60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
36e70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
36e80 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
36e90 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
36ea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36eb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
36ec0 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
36ed0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
36ee0 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
36ef0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
36f00 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
36f10 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
36f20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
36f30 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
36f40 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
36f50 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
36f60 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
36f70 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
36f80 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
36f90 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
36fa0 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
36fb0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
36fc0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
36fd0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
36fe0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
36ff0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
37000 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
37010 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
37020 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
37030 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37040 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
37050 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
37060 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
37070 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
37080 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
37090 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
370a0 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
370b0 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  ge_out;.  }else 
370c0 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a  if( pnChange ){.
370d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
370e0 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
370f0 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50   *pnChange += pP
37100 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  age->nCell;.  }.
37110 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
37120 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
37130 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
37140 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
37150 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37160 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
37170 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
37180 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
37190 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
371a0 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
371b0 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
371c0 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
371d0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
371e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
371f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
37200 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
37210 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
37220 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
37230 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
37240 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
37250 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
37260 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
37270 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
37280 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
37290 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
372a0 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
372b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
372c0 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
372d0 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
372e0 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
372f0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
37300 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
37310 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
37320 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
37330 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
37340 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
37350 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e  .**.** If pnChan
37360 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
37370 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  then table iTabl
37380 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  e must be an int
37390 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  key table. The.*
373a0 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * integer value 
373b0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e  pointed to by pn
373c0 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d  Change is increm
373d0 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
373e0 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  ber of.** entrie
373f0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
37400 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
37410 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
37420 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
37430 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  le, int *pnChang
37440 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
37450 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
37460 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
37470 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
37480 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
37490 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
374a0 45 20 29 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  E );.  if( (rc =
374b0 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
374c0 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
374d0 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  , 0, 1))!=SQLITE
374e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
374f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
37500 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
37510 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
37520 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
37530 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
37540 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
37550 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
37560 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
37570 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
37580 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
37590 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a   pnChange);.  }.
375a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
375b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
375c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
375d0 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
375e0 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
375f0 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
37600 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
37610 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
37620 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
37630 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
37640 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
37650 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
37660 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
37670 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
37680 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
37690 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
376a0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
376b0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
376c0 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
376d0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
376e0 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
376f0 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
37700 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
37710 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
37720 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
37730 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
37740 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
37750 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
37760 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
37770 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
37780 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
37790 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
377a0 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
377b0 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
377c0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
377d0 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
377e0 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
377f0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
37800 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
37810 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
37820 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
37830 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
37840 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
37850 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
37860 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
37870 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
37880 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
37890 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
378a0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
378b0 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
378c0 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
378d0 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
378e0 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
378f0 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
37900 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
37910 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
37920 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
37930 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
37940 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
37950 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
37960 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
37970 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
37980 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
37990 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
379a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
379b0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
379c0 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
379d0 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b  , int *piMoved){
379e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
379f0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
37a00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
37a10 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
37a20 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
37a30 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
37a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
37a50 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
37a60 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74  RITE );..  /* It
37a70 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64   is illegal to d
37a80 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20 61  rop a table if a
37a90 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20 6f  ny cursors are o
37aa0 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  pen on the.  ** 
37ab0 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
37ac0 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75 74  s because in aut
37ad0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74 68  o-vacuum mode th
37ae0 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20  e backend may.  
37af0 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20  ** need to move 
37b00 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61 67  another root-pag
37b10 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70 20  e to fill a gap 
37b20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
37b30 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61  ted.  ** root pa
37b40 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20 63  ge. If an open c
37b50 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67 20  ursor was using 
37b60 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f 62  this page a prob
37b70 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20  lem would .  ** 
37b80 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  occur..  */.  if
37b90 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29  ( pBt->pCursor )
37ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
37bb0 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
37bc0 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 43 75 72 73  ->db, pBt->pCurs
37bd0 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b  or->pBtree->db);
37be0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37bf0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
37c00 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  CACHE;.  }..  rc
37c10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
37c20 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
37c30 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65  o)iTable, &pPage
37c40 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
37c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
37c60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
37c70 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61  learTable(p, iTa
37c80 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ble, 0);.  if( r
37c90 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  c ){.    release
37ca0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
37cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
37cc0 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b  .  *piMoved = 0;
37cd0 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31  ..  if( iTable>1
37ce0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
37cf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37d00 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  M.    rc = freeP
37d10 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
37d20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
37d30 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66  e);.#else.    if
37d40 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
37d50 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  m ){.      Pgno 
37d60 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20  maxRootPgno;.   
37d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
37d80 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 42  treeGetMeta(p, B
37d90 54 52 45 45 5f 4c 41 52 47 45 53 54 5f 52 4f 4f  TREE_LARGEST_ROO
37da0 54 5f 50 41 47 45 2c 20 26 6d 61 78 52 6f 6f 74  T_PAGE, &maxRoot
37db0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Pgno);.      if(
37dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37dd0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
37de0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
37df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37e00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
37e10 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52  if( iTable==maxR
37e20 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  ootPgno ){.     
37e30 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
37e40 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
37e50 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69   is the table wi
37e60 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  th the largest r
37e70 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
37e80 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
37e90 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20  e database, put 
37ea0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e  the root page on
37eb0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20   the free list. 
37ec0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
37ed0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
37ee0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
37ef0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
37f00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
37f10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
37f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
37f40 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
37f50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
37f60 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
37f70 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  d does not have 
37f80 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
37f90 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
37fa0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
37fb0 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65  atabase. So move
37fc0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64   the page that d
37fd0 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  oes into the .  
37fe0 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66        ** gap lef
37ff0 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
38000 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20   root-page..    
38010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
38020 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20  emPage *pMove;. 
38030 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
38040 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
38050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
38060 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
38070 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
38080 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
38090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
380a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
380b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
380c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
380d0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
380e0 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d  pBt, pMove, PTRM
380f0 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
38100 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
38110 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
38120 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
38130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
38150 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
38160 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
38170 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
38180 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
38190 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
381a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
381b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
381c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
381d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
381e0 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
381f0 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
38200 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
38210 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
38220 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38230 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
38240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
38250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
38260 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
38270 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
38280 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
38290 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
382a0 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
382b0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
382c0 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
382d0 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
382e0 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
382f0 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
38300 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
38310 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
38320 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
38330 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
38340 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
38350 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
38360 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
38370 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
38380 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
38390 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
383a0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
383b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
383c0 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
383d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
383e0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
383f0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
38400 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
38410 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
38420 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
38430 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
38440 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
38450 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
38460 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
38470 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
38480 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
38490 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
384a0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
384b0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
384c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
384d0 28 70 50 61 67 65 2